如何避免"无法访问代码中的动态初始化"警告?

ein*_*ica 5 c++ templates instantiation compiler-warnings

我正在编写模板化函数*类似于以下内容:

template <typename T, bool v> 
void foo(T t1) {
    /* common code */
    if (v) {
        int i = bar();
        /* ... */
        return;
    }
    else {
        /* ... */
    }
    /* more common code */
}
Run Code Online (Sandbox Code Playgroud)

当我编译它并foo实例化v设置为false时,编译器说:

warning: dynamic initialization in unreachable code
Run Code Online (Sandbox Code Playgroud)

现在,由于模板参数,代码无法访问; 这应该是完全可以接受的.如何避免或抑制此警告?我宁愿不完全压制这种警告.

笔记:

  • 我宁愿不对true和false进行不同的专门化,因为有一些共同的代码,我不想复制,也不想人为地创建另一个函数.
  • 实际上它是由NVCC编译的CUDA内核.如果你能更一般地回答这个问题,请做,否则专门针对这个案例回答.

and*_*ras 4

据我所知,就目前的结构而言,没有简单的方法可以真正修复它(我也遇到了同样的问题,NVCC 也是如此)。但是,您可以专门化模板,v=true并且仅在该专门化中的 - 语句内插入代码if(v)

这绝不是最佳解决方案,因为它可能导致代码重复,但会修复警告。

如果您使用 GCC 作为主机编译器并且错误出现在主机代码中,您还可以尝试抑制警告,如下所示:

#pragma GCC diagnostic ignored "-Wunreachable-code"
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚注意到这可能是错误的警告代码,因为它通常是关于死代码的。完整的警告列表可以在这里找到:http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

这个问题可能也令人感兴趣:How to disable compiler warnings with nvcc