在特定变量上禁用 GCC“可能未初始化”

新手上路,请多包涵

我在堆栈变量上收到此警告:

 warning: object.member may be used uninitialized in this function

在这种情况下,我不希望强制初始化只是为了摆脱警告,因为它会消耗 CPU 周期。该变量是一个 POD 结构,因此 memset 不是零成本。我可以验证该变量从未在未初始化的情况下使用过,所以我只想取消它的警告。

一般来说,我确实想要警告,而不是在这个特定场景中的这个特定变量上。如何抑制警告?


看起来编译指示诊断是正确的方法,但它们需要相当新版本的 GCC (4.6)

在该版本已知之前没有可接受的解决方案。

原文由 edA-qa mort-ora-y 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 960
2 个回答

尝试这样做:

  #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

这个编译指示有三种有趣且有用的风格: warningerrorignored 。有关它们的用法,请参见 6.56.10 诊断编译指示。链接说,

GCC 允许用户有选择地启用或禁用某些类型的诊断,并更改诊断的类型。 例如,一个项目的策略可能要求所有源代码都使用 -Werror 进行编译,但某些文件可能具有允许特定类型警告的异常。或者,项目可能会选择性地启用诊断并将其视为错误,具体取决于定义的预处理器宏。

原文由 Nawaz 发布,翻译遵循 CC BY-SA 2.5 许可协议

GCC 区分未初始化和自初始化,例如编译:

 int main() {
   int i = i;
   return i;
}

使用 gcc -Wall -Wextra 不会给出任何警告,除非你明确添加了 -Winit-self ,但它通过我的快速测试得到了完全优化。

原文由 Flexo 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题