不推荐使用动态异常规范

use*_*566 4 c++ c++11

我有一些用于编译(和工作)的代码,现在我收到了很多以下警告.这是在我对Ubuntu-Mate进行了一次升级之后发生的.

警告:在C++ 11中不推荐使用动态异常规范

它发生在像这样简单的行上(在标题中):

    static Value getPriorityValue(const std::string& priorityName)
    throw(std::invalid_argument);
Run Code Online (Sandbox Code Playgroud)

我得到了与此有关的2545警告!反正有没有告诉编译器忽略这个警告?更改代码的最简单方法是什么?

大多数错误都在第三方软件包中,因此我不想对此软件包进行太多修改.

我的编译器中有-std = c ++ 11标志.

Hol*_*olt 10

您应该尽可能删除或注释掉这些异常规范1,例如:

static Value getPriorityValue(const std::string& priorityName);
static Value getPriorityValue(const std::string& priorityName) /* throw(...) */;
Run Code Online (Sandbox Code Playgroud)

您可以使用该-Wno-deprecated选项关闭无法编辑代码的地方的折旧警告.我建议仅在编译第三方库时使用它.如果您需要包含引发此类警告的第三方标头,您可以执行2:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
#include "thirdparty.h"
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

这应该与两者兼容gcc,clang并且仅对-Wdeprecated特定包含禁用.

1动态异常规范自C++ 11以来已被弃用,并且自C++ 17以来是非法的,因此您可能希望摆脱它们并尽快升级您正在使用的第三方库.

2如果使用-I参数包含这些标题,则可以切换-isystem为禁用这些标题的所有警告,如@Yakk - Adam Nevraumont所述.另请参见如何从库标题中抑制GCC警告?.

  • @VTT,如果你无意修改它实际上是第三方库. (5认同)
  • 还有一种方法可以将目录标记为系统标题,而不会生成任何警告.`-isystem`而不是`-I` - 请参阅/sf/ask/130694581/ (4认同)
  • @Slava *“工程师犯错是可以原谅的。他们不会因为隐藏错误而被原谅。”* (4认同)
  • 我宁愿建议将它们移到评论部分,而不是完全删除它们.尽管异常说明符总是在语言中有些无用,但它们仍然是代码文档的重要组成部分. (2认同)