动态异常规范已被弃用

6

我有一段C++代码,曾经可以编译(并且能够运行),但现在收到了许多警告信息。这是在我升级Ubuntu-Mate之后发生的。

警告:动态异常规范在C++11中已被弃用

它出现在如此简单的代码行中(在头文件中):

    static Value getPriorityValue(const std::string& priorityName)
    throw(std::invalid_argument);

我收到了2545个与此相关的警告!有没有办法告诉编译器忽略这个警告?最简单的方法是如何对代码进行更改。

大部分错误都出现在第三方包中,因此我不想对该包进行太多修改。

我在编译器中使用了-std=c++11标志。


3
最简单的修复方法是从函数声明中删除 throw(std::invalid_argument)(因为编译器已经告诉你它们已经被弃用)。另外,警告和错误不是同一件事情。 - UnholySheep
我认为您应该编辑您的问题,因为它们实际上并不是错误,只是警告信息。 - Ben
你可以使用#define throw(X) noexcept(false)进行编译...(这只是一个玩笑,请不要这样做) - YSC
@VTT已修复..... - YSC
2
动态异常规范已被弃用。这是标准委员会发出的警告,它们可能在未来版本的标准中被移除。与此同时,它们是合法的,其行为也是明确定义的。大多数编译器都有关闭特定警告的机制,您应该使用它们。如果您从此代码中获得错误(即编译器拒绝编译它),则您的编译器不符合语言定义。 - Pete Becker
显示剩余2条评论
1个回答

13

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

static Value getPriorityValue(const std::string& priorityName);
static Value getPriorityValue(const std::string& priorityName) /* throw(...) */;

在无法编辑代码的地方,您可以使用-Wno-deprecated选项关闭弃用警告。我建议只在编译第三方库时使用它。如果您需要包含一个引发此类警告的第三方头文件,可以采取以下措施2

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
#include "thirdparty.h"
#pragma GCC diagnostic pop

这应该适用于gccclang,将只禁用特定的头文件中的-Wdeprecated警告。

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

2 如果您使用-I参数包含这些头文件,您可以切换到-isystem以禁用这些头文件中的所有警告,如@Yakk - Adam Nevraumont所述。 参见如何抑制库头文件中的GCC警告?


4
还有一种将目录标记为系统头文件并且不生成任何警告的方法,即使用-isystem代替-I。详情请见https://dev59.com/XXI-5IYBdhLWcg3wbHm-。 - Yakk - Adam Nevraumont
@Yakk-AdamNevraumont 抑制所有警告从来不是一个好主意。 - user7860670
5
如果你没有修改第三方库的意图,那么实际上就是这样。 - Slava
3
不要完全删除它们,我建议将它们移到注释部分。尽管异常说明符始终是语言中有些无用的部分,但它们仍可能是代码文档中有价值的一部分。 - user7860670
6
“工程师犯错是可以原谅的,但隐瞒错误则不可原谅。” - user7860670

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接