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

时间:2014-03-27 10:00:05

标签: 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 */
}

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

warning: dynamic initialization in unreachable code

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

备注:

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

1 个答案:

答案 0 :(得分:4)

对于目前的构造,没有简单的方法可以真正解决它(我有同样的问题,也有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