我想使用g ++和-錯誤,所以我現在已經禁用了我無法控制的第三方庫的警告。 http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html提供的解決方案效果很好,只需將包含第三方標頭的內容包含在雜注中即可。不幸的是,在涉及模板的特定設置中,這對我不起作用。我創建的,其中如預期這種做法沒有奏效以下小例子:如何在C++模板函數中使用GCC診斷編譯指示?
源文件main.cpp中
#pragma GCC diagnostic ignored "-Wunused-parameter"
#include "hdr.hpp"
#pragma GCC diagnostic error "-Wunused-parameter"
int main() {
return mytemplatefunc(2) + mystandardfunc(3); // will print ONLY ONE warning
}
和頭hdr.hpp
template<typename T>
int mytemplatefunc(T t) {
return 42;
}
int mystandardfunc(int i) {
return 53;
}
使用的Makefile
編譯CPPFLAGS+=-Wunused-parameter -Werror
main: main.cpp
會產生下列編譯器錯誤
g++ -Wunused-parameter -Werror main.cpp -o main
In file included from main.cpp:3:
hdr.hpp: In instantiation of ‘int mytemplatefunc(T) [with T = int]’:
main.cpp:29: instantiated from here
hdr.hpp:2: error: unused parameter ‘t’
make: *** [main] Error 1
shell returned 2
請注意,在包含頭文件後直接在main.cpp中顯式實例化不起作用,並且將調用包裝到main.cpp中的模板函數也不起作用。令人困惑的是,在主函數前放#pragma GCC diagnostic ignored "-Wunused-parameter"
使編譯器無聲,然後在文件的非常結尾處添加#pragma GCC diagnostic error "-Wunused-parameter"
,導致編譯器再次產生錯誤。如何解決這個難題?
(請注意,有幾十個關於這個編譯線程,但我無法找到任何 ,參與這樣的設置)
從提供的鏈接中,「GCC跟蹤每個附註的位置,並根據源文件中的那個狀態發佈診斷信息,因此,在一行之後出現的#pragma不會影響診斷由該線引起的。「所以如果你仍然遇到問題,即使你只是在代碼的末尾重新開啓錯誤......你是否嘗試過使用第二個'#pragma'作爲'diagnostic warning'而不是'diagnostic error'?如果它仍然將其報告爲錯誤而不是警告,那麼您可能需要檢查頭文件中的#pragma文件。 – JAB 2011-06-03 13:46:24
沒有,那麼它會報告警告。但是這並不符合我的要求。這樣做的全部想法是出現錯誤而不是警告(-Werror),這樣我就會收到編譯失敗通知,而不必手動掃描多頁編譯器輸出(如果我必須區分警告我實際上可以做些什麼,並且我必須忽略警告)。我認爲hdr.hpp不在我的控制之下(想象它是第三方)。 – Julius 2011-06-05 05:14:53
http://www.spinics.net/lists/gcchelp/msg30702.html似乎涉及到這個問題。我正在使用gcc 4.4.5。而且似乎不支持在比文件級更好的範圍內使用這種編譯指示。在進一步的測試中,我取消了頭文件,並使用-Wuninitialized進行了遊戲,而且表現也很奇怪。 – Julius 2011-06-14 21:29:02