我想使用g++和-Werror,所以现在我需要禁用我无法控制的第三方库的警告。 http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html提供的解决方案非常好,可以简单地使用pragma包装第三方头文件。不幸的是,在涉及模板的某些设置中,这种方法对我不再起作用。我创建了以下最小示例,其中此方法未按预期工作:
将会产生以下编译器错误。
请注意,直接在 main.cpp 中包含头文件后进行显式实例化并不起作用,而在 main.cpp 中包装模板函数的调用也不起作用。令人困惑的是,在主函数前加上
(注意,有关此 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"
可以使编译器静音,但在文件的 最后 添加 #pragma GCC diagnostic error "-Wunused-parameter"
会导致编译器再次产生错误。如何解决这个谜题?(注意,有关此 pragma 的讨论有数十个帖子,但我找不到涉及这种设置的任何帖子)