【问题标题】:How can I avoid the "dynamic initialization in unreachable code" warning?如何避免“无法访问代码中的动态初始化”警告?
【发布时间】:2014-03-27 10:00:05
【问题描述】:

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

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

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

注意事项:

  • 我宁愿不对真假进行不同的专门化,因为有一些共同的代码,我不想复制,也不想人为地创建另一个函数。
  • 实际上它是一个由 NVCC 编译的 CUDA 内核。如果您能更笼统地回答问题,请回答,否则请针对这种情况专门回答。

【问题讨论】:

  • 我担心,你的测试用例没有反映实际问题
  • 你可以专攻v
  • @pmr 这是真的,但我经常在 CUDA 代码中看到这样的代码。这样,与使用函数参数相比,可以更好地优化设备代码,从而减少代码和通常更小的寄存器使用量,同时仍然避免重复代码。
  • @pmr:编辑了我的示例,以使您的评论不再是问题,即降低专业化的相关性。另外,我认为 nvcc 只会阻止对 v 的部分专业化。

标签: c++ templates instantiation compiler-warnings


【解决方案1】:

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

【讨论】:

  • 这个编译指示的范围是什么?我该如何关闭它?此外,我调整了我的示例,以使专门针对 v=true 变得更加不合理。
  • 范围是“直到编译单元结束”。要保存/恢复当前状态,请分别使用#pragma GCC diagnostic push#pragma GCC diagnostic pop
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多