2016-08-05 89 views
0

我有一個奇怪的g ++行爲,它顯示了有關無法識別的命令行選項的警告,當顯示任何其他警告時。cc1plus:無法識別的命令行選項警告任何其他警告

實施例:

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’ 

ADDITION:沒有警告/錯誤當我g++-5 -Wno-c99-extensions a.cpp因此該選項編譯傳遞CMAKEs檢測信號採用CHECK_CXX_COMPILER_FLAG

這使我困擾不少,因爲我們使用Werror,但通過Wn例外o-error = ...然後,當任何(無錯誤)警告顯示在「無法識別的命令行選項」中時,它會自動退出

這是已知的/預期的嗎?如何防止?

+1

對於downvoters:您可以添加評論爲什麼你downvoted?然後我可以改進這個問題。正如我剛纔注意到的那樣,我忘了提及國旗本身並沒有提出警告/錯誤 – Flamefire

回答

1

如果您不想要關於無法識別的命令行選項的警告,請不要使用無法識別的命令行選項:-Wno-c99-extensions從來沒有成爲有效的GCC選項(我相信這是一種譁衆取寵)。只需從構建命令中刪除它。

至於爲什麼,當你有另一警告目前的警告只發出的,這種行爲似乎違反直覺的,但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,並且對其構建腳本進行了微小的修復以「修復」它。

+0

似乎你是對的。在添加它之前,我使用了CMAKEs CHECK_CXX_COMPILER_FLAG,以避免檢查特定的編譯器。似乎我忘記添加到如果沒有其他錯誤沒有警告/錯誤的問題。所以真正的問題是:當沒有警告時,爲什麼我什麼都得不到,但當有(無關的)警告時,爲什麼我會得到額外的警告/錯誤? – Flamefire

+0

@火焰火焰:誰在乎?你正在使用一個不存在的標誌。爲什麼試圖合理化其行爲?只需停止使用它。 –

+1

當您使用CMake進行多平臺/多編譯器項目時,您會很在意。當然,您可以檢查每個編譯器並根據該編譯器及其版本添加標誌。但是這很容易變得非常大並且容易出錯。這是'CHECK_CXX_COMPILER_FLAG'的用例之一,但由於行爲不一致而失敗。 – Flamefire

相關問題