Удалите спецификации исключений из кода C++ с помощью sed
Я хочу автоматически удалить устаревшие спецификации исключений из моего кода C++ и попытаться использовать sed для этой задачи.
Формат спецификации исключения throw
следующий со списком исключений (слов) в скобках, поэтому я написал это sed:
sed -r 's,throw\s*[(].*[)],,g' foo.cpp
Он работает для однострочных спецификаций, но не работает для многострочных.
Кажется, что точка не соответствует символам новой строки, хотя в соответствии с документацией: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
Я пробовал этот обходной путь, но он также не работает (на самом деле он даже не работает для oneline спецификаций):
sed -r 's,throw\s*[(][\s\S]*[)],,g'
Как заставить это работать должным образом?
ИЗДАНО:
пример спецификации исключения:
void foo() throw (std::runtime_error); //oneline
void bar() throw (std::runtime_error,
std::logic_error); //multiline
2 ответа
Многие текстовые редакторы (например, jEdit) поддерживают поиск и замену регулярных выражений в нескольких файлах.
Однако нет синтаксического различия между спецификацией throw и выражением throw, бросающим переменную в скобках. Два в основном различаются в первую очередь тем, что они не появляются в одном и том же синтаксическом контексте. Вы также можете различить их, решив имя. Но это не сработает, чтобы отличить выражение броска throw(foo())
, который выбрасывает созданный по умолчанию объект типа foo, и спецификацию throw throw(foo())
, что делает абсурдным, но технически обоснованным утверждение, что аннотированная функция может выдавать исключение типа "функция, которая не принимает аргументов и возвращает foo".
Если вам нужен надежный способ удаления спецификаций исключений, лучше всего написать чек Clang Tidy.
Кажется, для этого уже есть чёткая проверка. Я еще не тестировал, но выглядит многообещающе. https://clang.llvm.org/extra/clang-tidy/checks/modernize-use-noexcept.html