2011-06-03 67 views
5

我想使用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",導致編譯器再次產生錯誤。如何解決這個難題?

(請注意,有幾十個關於這個編譯線程,但我無法找到任何 ,參與這樣的設置)

+0

從提供的鏈接中,「GCC跟蹤每個附註的位置,並根據源文件中的那個狀態發佈診斷信息,因此,在一行之後出現的#pragma不會影響診斷由該線引起的。「所以如果你仍然遇到問題,即使你只是在代碼的末尾重新開啓錯誤......你是否嘗試過使用第二個'#pragma'作爲'diagnostic warning'而不是'diagnostic error'?如果它仍然將其報告爲錯誤而不是警告,那麼您可能需要檢查頭文件中的#pragma文件。 – JAB 2011-06-03 13:46:24

+0

沒有,那麼它會報告警告。但是這並不符合我的要求。這樣做的全部想法是出現錯誤而不是警告(-Werror),這樣我就會收到編譯失敗通知,而不必手動掃描多頁編譯器輸出(如果我必須區分警告我實際上可以做些什麼,並且我必須忽略警告)。我認爲hdr.hpp不在我的控制之下(想象它是第三方)。 – Julius 2011-06-05 05:14:53

+0

http://www.spinics.net/lists/gcchelp/msg30702.html似乎涉及到這個問題。我正在使用gcc 4.4.5。而且似乎不支持在比文件級更好的範圍內使用這種編譯指示。在進一步的測試中,我取消了頭文件,並使用-Wuninitialized進行了遊戲,而且表現也很奇怪。 – Julius 2011-06-14 21:29:02

回答

1

的常用方法,以表明你不打算使用的參數是不給它一個名字:

template<typename T> 
int mytemplatefunc(T /* t */) 
{ return 42; } 

int mystandardfunc(int /* i */) 
{ return 53; } 
+0

是的,那可行!實際上,我應該在我的描述中包含標題實際上超出了我的控制範圍,所以我無法修復標題,而必須在包含該標題的代碼部分中對警告進行沉默。 – Julius 2011-06-05 05:03:22

4

的問題是,當你使用它,而不是當它是由編譯器解析頭文件,這樣就不會發出警告,直到它的模板實例化編譯將int替換爲int,並將其解析爲除編譯指示靜默語境之外的常規函數​​。

相關問題