Я хочу автоматически удалить устаревшие спецификации исключений из моего кода 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
Многие текстовые редакторы (например, jEdit) поддерживают поиск по регулярным выражениям в нескольких файлах. & заменить.
Однако нет синтаксического различия между спецификацией throw и выражением throw, бросающим переменную в скобках. Два в основном различаются в первую очередь тем, что они не появляются в одном и том же синтаксическом контексте. Вы также можете различить их, решив имя. Но это не сработает, чтобы отличить выражение броска throw(foo())
, который выбрасывает созданный по умолчанию объект типа foo, и спецификацию throw throw(foo())
, что делает абсурдным, но технически обоснованным утверждение, что аннотированная функция может выдавать исключение типа «функция, которая не принимает аргументов и возвращает foo».
Если вам нужен надежный способ исключения спецификаций исключений, лучше всего написать Clang Tidy проверять.
Других решений пока нет …