c++ - 如何避免 "dynamic initialization in unreachable code"警告?

标签 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 内核。如果您可以更笼统地回答问题,请回答,否则请专门针对此案例回答。

最佳答案

对于当前的构造,没有我所知道的真正修复它的简单方法(我有同样的问题,也有 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/

相关文章:

c++ - 我如何使用 X11 获取当前光标位于其顶部的窗口?

c++ - 值传递和 std::move 与转发引用

performance - AS3-创建实例以访问方法/函数或使用静态[更新-一些基准测试-已添加]

java - 从 Java/Scala 实例化 Rhinoscript native 对象

c++ - << 运算符重写为 cout int 和 double 值

c++ - Effective C++ Item 43 了解如何访问模板化基类中的名称

c++ - 代表模板类型的名称应该是单个字符吗?

c++ - 使用 boost::iterator_facade<> 为迭代器返回 ref 但为 const_iterator 返回 const_ref?

java - 为什么 ReflectionFactor.newConstructorForSerialization() 返回的构造函数称为 "munged"?

c++ - CIN 回路不工作