使用 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
我想从我的 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