5

我想使用 g++ 和-Werror,所以我现在必须禁用我无法控制的第 3 方库的警告。http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html提供的解决方案效果很好,允许简单地用编译指示包装第 3 方标头的包含。不幸的是,在涉及模板的特定设置中,这不再适用于我。我创建了以下最小示例,说明这种方法没有按预期工作:

源文件 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 函数前面会使编译器静音,而#pragma GCC diagnostic error "-Wunused-parameter"在文件的最后添加会导致编译器再次产生错误。如何解决这个难题?

(注意,关于这个编译指示有几十个线程,但我找不到任何涉及这种设置的人)

4

2 回答 2

5

问题是模板的实例化是在您使用它时编译的,而不是在编译器在头文件中解析它时,因此它不会发出警告,直到它将 T 替换为 int 并将其解析为外部的常规函数pragma 沉默的语境。

于 2011-06-03T13:49:53.077 回答
1

表明您不打算使用参数的常用方法是不给它一个名称:

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

int mystandardfunc(int /* i */) 
{ return 53; } 
于 2011-06-03T13:45:31.187 回答