如何使用GCC诊断pragma与C++模板函数?

Jul*_*ius 5 c++ gcc templates diagnostics pragma

我想使用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
}
Run Code Online (Sandbox Code Playgroud)

和标题hdr.hpp

template<typename T>
int mytemplatefunc(T t) {
    return 42;
}
int mystandardfunc(int i) {
    return 53;
}
Run Code Online (Sandbox Code Playgroud)

使用Makefile编译

CPPFLAGS+=-Wunused-parameter -Werror
main: main.cpp
Run Code Online (Sandbox Code Playgroud)

将产生以下编译器错误

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
Run Code Online (Sandbox Code Playgroud)

请注意,在包含标头之后,main.cpp中的显式实例化不起作用,并且将调用包装到main.cpp中的模板函数也不起作用.令人费解的是,放在#pragma GCC diagnostic ignored "-Wunused-parameter"main函数前面使编译器静音,然后#pragma GCC diagnostic error "-Wunused-parameter"在文件的最后添加导致编译器再次产生错误.如何解决这个难题?

(注意,关于这个pragma有很多线程,但我找不到涉及这种设置的任何人)

Dav*_*vid 5

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


Bo *_*son 2

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

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

int mystandardfunc(int /* i */) 
{ return 53; } 
Run Code Online (Sandbox Code Playgroud)