2011-06-03 55 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,并将其解析为除编译指示静默语境之外的常规函数​​。

相关问题