使用 sed 从 C++ 代码中删除异常规范

Remove exception specifications from C++ code with 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

许多文本编辑器(例如 jEdit)支持多文件正则表达式搜索和替换。

但是,抛出规范和抛出带括号的变量的抛出表达式之间没有语法区别。两者的主要区别主要在于没有出现在相同的句法上下文中。您还可以通过解析名称来区分它们。但这无法区分抛出表达式 throw(foo()) 和抛出规范 throw(foo()),抛出表达式 throw(foo()) 抛出类型为 foo 的默认构造对象可能会抛出 "function that takes no arguments and returns a foo".

类型的异常

如果您想要一种可靠的方法来剥离异常规范,最好的方法是编写 Clang Tidy 检查。

已经对此进行了整洁的检查。

我用这个命令行

用 noexcept(false) 替换了我们来源中的抛出规范
clang-tidy --fix --checks=-*,modernize-use-noexcept foo.cpp -- -I /my/include/path

包含路径和定义等编译器选项需要放在 -- 之后。有关更多文档,请参阅 https://clang.llvm.org/extra/clang-tidy/checks/modernize-use-noexcept.html