3

我想从我的 c++ 代码中自动删除不推荐使用的异常规范,并尝试使用 sed 来完成此任务。

异常规范格式throw后面是括号之间的异常(单词)列表,所以我写了这个 sed:

sed -r 's,throw\s*[(].*[)],,g' foo.cpp

它适用于单行规范,但不适用于多行规范。

根据文档,点似乎与换行符不匹配,它必须:https ://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html

我尝试了这种解决方法,但它也不起作用(实际上它甚至不适用于单行规范):

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
4

2 回答 2

3

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

但是,抛出规范和抛出括号变量的抛出表达式之间没有语法区别。两者的主要区别主要在于不在相同的句法上下文中出现。您还可以通过解析名称来区分它们。但这并不能区分 throw 表达式throw(foo()),它抛出一个默认构造的 foo 类型的对象,以及 throw 规范throw(foo()),这使得一个荒谬但在技术上有效的声明,即带注释的函数可能抛出类型为“函数的异常”没有参数并返回一个 foo"。

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

于 2016-02-05T09:04:22.980 回答
1

已经有一个clang-tidy检查了。

我用这个命令行用 noexcept(false) 从我们的源代码中替换了 throw 规范

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

于 2021-09-03T08:31:54.680 回答