我想使用g ++和 -Werror ,所以我现在要禁用我无法控制的第三方库的警告。 http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html提供的解决方案非常有效,允许简单地用pragma包装第三方标题。不幸的是,在涉及模板的某个设置中,这对我来说不再适用。我创建了以下最小的示例,说明此方法无法按预期工作:
源文件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"
放在main函数前面会使编译器静音,然后在文件的 very end 处添加#pragma GCC diagnostic error "-Wunused-parameter"
会导致编译器再次产生错误。如何解决这个难题?
(注意,关于这个pragma有几十个主题,但我找不到任何人 涉及这样的设置)
答案 0 :(得分:5)
问题是模板的实例化是在你使用它时编译的,而不是在头文件中被编译器解析时编译的,因此它不会发出警告,直到它用int替换T并将其作为常规解析在pragma沉默的语境之外发挥作用。
答案 1 :(得分:1)
表明您不打算使用参数的通常方法是不给它起一个名字:
template<typename T>
int mytemplatefunc(T /* t */)
{ return 42; }
int mystandardfunc(int /* i */)
{ return 53; }