如何禁用关于#warning 指令是 GCC 扩展的 GCC 警告?

Posted

技术标签:

【中文标题】如何禁用关于#warning 指令是 GCC 扩展的 GCC 警告?【英文标题】:How to disable GCC warning about the #warning directive being a GCC extension? 【发布时间】:2013-06-01 12:53:08 【问题描述】:

当使用#warning 指令时,我得到的不是一个警告,而是两个 - 我生成的一个,加上一个额外的 warning: #warning is a GCC extension [enabled by default].

我可以使用-Wno-cpp 抑制#warning 指令的结果本身,但这与我想要的相反。

我可以改用#pragma message() 来解决这个问题,但这似乎使#warning 指令变得毫无意义——有没有办法抑制这个警告警告?

【问题讨论】:

你传递给 GCC 的选项是什么? 在这种情况下是-g -static -static-libgcc -Wall -Wextra -pedantic -Wno-vla -Wsizeof-pointer-memaccess -Wmissing-declarations -march=native -fexceptions -fexpensive-optimizations -flto -O3 -std=c++1y -fsanitize=address - 请参阅下面的答案,我意识到这是负责任的 -pedantic 选项。 【参考方案1】:

啊,-pedantic 选项似乎启用了此警告,并且似乎没有针对它的特定覆盖,就像大多数其他 GCC 警告一样。删除 -pedantic 会消除有关警告的警告。

【讨论】:

【参考方案2】:
#ifdef __GNUC__
#warning "no warning here!"
#endif

使用或不使用 gcc 都可以编译,即使使用 -pedantic,但它仍然会发出警告(如果警告升级为错误,则会失败)。

更新: 根据this related question,没有干净的解决方案可以选择性地禁用有关 gnu 特定 #pragma s 的警告

【讨论】:

当然它会编译,无论如何,但这并不能消除警告:warning: #warning is a GCC extension [enabled by default] 是的,我自己也意识到了这一点。绝望地寻找一个编译指示来关闭该死的东西。 (添加#pragma GCC diagnostic ignored "-Wunknown-pragmas" 似乎不起作用。)【参考方案3】:

实际上,以下应该可以工作。有了它,您可以抑制/忽略 gcc 警告。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcpp"

...

#pragma GCC diagnostic pop

【讨论】:

虽然这是个好主意,但恐怕这不适用于 -pedantic 警告。在此处查看测试代码:coliru.stacked-crooked.com/…

以上是关于如何禁用关于#warning 指令是 GCC 扩展的 GCC 警告?的主要内容,如果未能解决你的问题,请参考以下文章

msvc/gcc:中用#pragma指令关闭特定警告(warning)

仅针对一个标头禁用#warning

在特定变量上禁用 GCC“可能未初始化”

有没有办法让 gcc 禁用特定警告

gcc -fno-trapping-math 有啥作用?

gcc 禁用特定文件/文件夹的 -Wall 标志