我在堆栈变量上收到以下警告:
warning: object.member may be used uninitialized in this function
在这种情况下,我不希望强制初始化来消除警告,因为它会消耗CPU周期。变量是POD结构,因此对其执行memset
不是零成本。我可以验证该变量从未在未初始化的情况下使用,因此我只想抑制它的警告。
一般来说,我确实想要警告,只是在这个特定的场景中,不在这个特定的变量上。我如何抑制警告?
看起来pragma诊断是正确的方法,但是它们需要相当新版本的GCC(4.6)
在该版本之前没有已知的可接受解决方案。
5条答案
按热度按时间lawou6xi1#
请尝试执行以下操作:
这个pragma有三种有趣且有用的形式:
warning
、error
、ignored
。请参阅6.56.10 Diagnostic Pragmas了解它们的用法。链接内容如下:**GCC允许用户有选择地启用或禁用某些类型的诊断,并更改诊断的种类。**例如,项目的策略可能要求所有源代码都使用-Werror进行编译,但某些文件可能具有允许特定类型警告的异常。或者,项目可能有选择地启用诊断,并根据定义的预处理器宏将其视为错误。
rta7y2nd2#
公认的答案有两个大问题,需要更多的注解。首先,它取消了整个文件的警告。如果该pragma驻留在一个头文件中,可能更多。警告是有用的,如果它确实是一个误报,人们应该禁用一堆代码的警告尽可能小。
那么OP中的警告是“maybe uninitialized”,它由-Wmaybe-uninitialized(与-Wuninitialized相反)停用。
ztmd8pv53#
GCC区分未初始化和自初始化,例如编译:
使用
gcc -Wall -Wextra
不会给出任何警告,除非您也显式添加了-Winit-self
,但通过我的快速测试,它已经完全优化了。mdfafbf14#
@Nawaz已经回答了这个问题,但是您是否考虑过,您需要这样做的事实可能表明您过早地声明了
struct
/在一个不适当的嵌套作用域中声明了struct
?通常,如果您能够在可以实际初始化它的位置声明struct
,而不是更早地声明它并在不同的位置填充它,那将是更好的选择。而且,即使你可以确认它从未在未初始化的情况下使用过,如果将来有人添加了一个新的代码路径,而它没有正确初始化,该怎么办?如果你禁用了警告,它将在无提示的情况下编译,并可能以一种意想不到的方式中断。除非你能证明初始化占用了你程序的CPU的可测量的量,否则最好是提前进行初始化。
h6my8fg25#
Selectively disable GCC warnings for only part of a translation unit?