Удалите спецификации исключений из кода 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

Другие вопросы по тегам