我正在编写类似于以下内容的模板化函数*:
template <typename T, bool v>
void foo(T t1) {
/* common code */
if (v) {
int i = bar();
/* ... */
return;
}
else {
/* ... */
}
/* more common code */
}
当我编译它并且 foo
被实例化时 v
设置为 false,编译器说:
warning: dynamic initialization in unreachable code
现在,由于模板参数,代码无法访问;这应该是完全可以接受的。我怎样才能避免或抑制这个警告?我宁愿不完全禁止此类警告。
注意事项:
- 我不想对 true 和 false 进行不同的专门化,因为有一些通用代码,我不想重复,也不想人为地创建另一个函数。
- 实际上它是由 NVCC 编译的 CUDA 内核。如果您可以更笼统地回答问题,请回答,否则请专门针对此案例回答。
最佳答案
对于当前的构造,没有我所知道的真正修复它的简单方法(我有同样的问题,也有 NVCC)。但是,您可以将模板特化为 v=true
,并且仅在该特化中将代码插入到 if(v)
语句中。
这绝不是最佳解决方案,因为它会导致代码重复,但会修复警告。
如果您使用 GCC 作为主机编译器并且错误出在主机代码中,您也可以尝试像这样抑制警告:
#pragma GCC diagnostic ignored "-Wunreachable-code"
编辑:刚刚注意到这可能是错误的警告代码,因为它通常是关于死代码的。可以在此处找到完整的警告列表:http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
这个问题可能也很有趣:How to disable compiler warnings with nvcc
关于c++ - 如何避免 "dynamic initialization in unreachable code"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22684059/