cc1plus:对任何其他警告的无法识别的命令行选项警告

时间:2016-08-05 08:54:47

标签: c++ g++ compiler-warnings suppress-warnings

我有一个奇怪的g ++行为,当显示任何其他警告时,它会显示有关无法识别的命令行选项的警告。

示例:

struct Foo{virtual int bar() = 0;};
struct Bar:public Foo{int bar() {return 0;} };

int main(){}

使用g++-5 -Wsuggest-override -Wno-c99-extensions -std=c++11 a.cpp或甚至g++-5 -Wsuggest-override -Wno-c99-extensions a.cpp进行编译会显示:

a.cpp:2:27: warning: ‘virtual int Bar::bar()’ can be marked override [-Wsuggest-override]
 struct Bar:public Foo{int bar() {return 0;} };
                           ^
cc1plus: warning: unrecognized command line option ‘-Wno-c99-extensions’

附加:使用g++-5 -Wno-c99-extensions a.cpp编译时没有警告/错误因此该选项使用CHECK_CXX_COMPILER_FLAG

通过CMAKE检查

这让我很烦恼,因为我们使用Werror,但是通过Wno-error =有例外情况......当任何(非错误)警告显示“无法识别的命令行选项”时,它会失效/ p>

这是已知/预期的吗?如何预防?

1 个答案:

答案 0 :(得分:0)

如果您不想要了解有关无法识别的命令行选项的警告,请不要使用无法识别的命令行选项:-Wno-c99-extensions从未成为有效的GCC选项(我相信它' sa clangism)。只需从构建命令中删除它。

至于为什么仅在出现另一个警告时发出警告,此行为似乎违反直觉但it is actually deliberate and documented

  

警告"无法识别的命令行选项"没有给出-Wno-foo

     

自GCC 4.4以来,如GCC手册中所述:当请求无法识别的警告选项(-Wunknown-warning)时,GCC会发出诊断,指出该选项无法识别。但是,如果使用-Wno-形式,则行为略有不同:除非正在生成其他诊断,否则不会为-Wno-unknown-warning生成诊断。这允许在旧编译器中使用新的-Wno-选项,但是如果出现问题,编译器会警告存在无法识别的选项。(请参阅PR28322了解此更改的历史记录)

     

这可能会破坏检查-Wno-foo选项的配置测试。解决方案是测试正形式(-Wfoo)或使用触发其他警告的测试用例进行测试。

事实上,Google的邮件列表线程中有一些结果,软件开发人员已经面临这个"问题",特别是与CMake,并对他们的构建脚本进行了微不足道的修复以及#34;修复&# 34;它