我有一个奇怪的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
这让我很烦恼,因为我们使用Werror,但是通过Wno-error =有例外情况......当任何(非错误)警告显示“无法识别的命令行选项”时,它会失效/ p>
这是已知/预期的吗?如何预防?
答案 0 :(得分:0)
如果您不想要了解有关无法识别的命令行选项的警告,请不要使用无法识别的命令行选项:-Wno-c99-extensions
从未成为有效的GCC选项(我相信它' sa clangism)。只需从构建命令中删除它。
至于为什么仅在出现另一个警告时发出警告,此行为似乎违反直觉但it is actually deliberate and documented:
事实上,Google的邮件列表线程中有一些结果,软件开发人员已经面临这个"问题",特别是与CMake,并对他们的构建脚本进行了微不足道的修复以及#34;修复&# 34;它警告"无法识别的命令行选项"没有给出-Wno-foo
自GCC 4.4以来,如GCC手册中所述:当请求无法识别的警告选项(
-Wunknown-warning
)时,GCC会发出诊断,指出该选项无法识别。但是,如果使用-Wno-
形式,则行为略有不同:除非正在生成其他诊断,否则不会为-Wno-unknown-warning
生成诊断。这允许在旧编译器中使用新的-Wno-
选项,但是如果出现问题,编译器会警告存在无法识别的选项。(请参阅PR28322了解此更改的历史记录)这可能会破坏检查
-Wno-foo
选项的配置测试。解决方案是测试正形式(-Wfoo
)或使用触发其他警告的测试用例进行测试。