在GCC中使用-Wall
进行编译时,GCC会警告使用可能未初始化的变量。但是,作为程序员,我知道如果控件进入某个if
语句,则必须初始化变量:
int foo;
/* conditional assignment of foo goes here */
if (/* complicated condition that guarantees that foo has been initialized */){
return test(foo);
}
在上面的代码中,GCC会抱怨foo
可能未经初始化使用。特别是,投诉将来自test()
的定义,其中实际使用foo
。
是否有内置或等效的GCC告诉编译器foo
已经初始化了?例如:
if (/* complicated condition that guarantees that foo has been initialized */){
__assume_initialized(foo);
return test(foo);
}
请注意,在行#pragma GCC diagnostic ignored "-Wuninitialized"
之前放置return test(foo)
是不够的,因为未初始化警告来自test()
定义中foo的使用(例如比较),可能在另一个编译单元中,pragma不存在。
我也不想将编译指示放在test()
的定义中,因为问题不在于test()
。当然不应该使用随机垃圾来调用test()
,并且将编译指示放在那里可能会导致其他错误被忽视。
任何解决方案?
答案 0 :(得分:2)
最简单的解决方案是(冗余地)初始化该变量,例如:添加:
int foo=0;
优化编译器(例如g++ -O2
)很可能在不需要时删除该初始化。顺便说一句,如果编译器在你的特定情况下不优化它,那么这种初始化的开销实际上很小。
如果foo
是某个class
的实例,您可以定义一个无操作的构造函数(可能是一个private:
)并创建该类的函数friend
。
如果foo
是某个指针,则将其初始化为nullptr
。
BTW,这样的显式初始化使您的代码更容易可读并且不那么脆弱,甚至可能更加CPU cache友好。您可以添加注释,解释为什么以及如何不需要它。恕我直言,可读性的提高足以证明这种初始化的合理性。
我倾向于始终初始化本地化,让编译器有机会优化大部分无用的初始化。
或者(但我不建议)使用function specific pragma(如问题中所述)来禁用此类警告。