【问题标题】:dynamic exception specifications are deprecated不推荐使用动态异常规范
【发布时间】:2018-05-09 13:28:56
【问题描述】:

我有用于编译(和工作)的 C++ 代码,现在我收到很多警告。这发生在我对 Ubuntu-Mate 进行了 dist 升级之后。

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

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

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

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

大部分错误都在第 3 方包中,所以我不想对这个包做太多修改。

我的编译器中确实有 -std=c++11 标志。

【问题讨论】:

  • 修复它的最简单方法是从函数声明中删除throw(std::invalid_argument)(因为编译器告诉你它们已被弃用)。此外,警告与错误不同
  • 我认为您应该编辑您的问题,因为它们实际上不是错误,而只是警告。
  • 你可以用#define throw(X) noexcept(false)编译...(这是个玩笑,不要这样做)
  • @YSC 这可能会破坏所有抛出异常的代码。
  • 不推荐使用动态异常规范。这是来自标准委员会的警告,他们可能在标准的未来版本中被删除。与此同时,他们是合法的,他们的行为是明确的。大多数编译器都有关闭特定警告的机制,这就是你应该使用的。如果你从这段代码中得到错误(即编译器拒绝编译它),那么你的编译器不符合语言定义。

标签: c++ c++11


【解决方案1】:

您应该尽可能删除或注释掉这些异常规范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 所述。另见How to suppress GCC warnings from library headers?

【讨论】:

  • 还有一种方法可以将目录标记为系统标头而不产生任何警告。 -isystem 而不是 -I -- 请参阅 stackoverflow.com/q/1867065/1774667
  • @Yakk-AdamNevraumont 禁止所有警告绝不是一个好主意。
  • @VTT 如果您无意修改第 3 方库,它实际上是。
  • 我宁愿建议将它们移到评论部分,而不是完全删除它们。尽管异常说明符在语言中总是有些无用的部分,但它们可能仍然是代码文档中有价值的部分。
  • @Slava “工程师犯错误是被原谅的。他们不会因为隐藏错误而被原谅。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2021-11-11
  • 1970-01-01
  • 2010-09-16
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多