告诉GCC假设对象已初始化

时间:2017-06-06 06:20:30

标签: c++ gcc compiler-warnings suppress-warnings uninitialized-constant

在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(),并且将编译指示放在那里可能会导致其他错误被忽视。

任何解决方案?

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是(冗余地)初始化该变量,例如:添加:

int foo=0;

优化编译器(例如g++ -O2)很可能在不需要时删除该初始化。顺便说一句,如果编译器在你的特定情况下不优化它,那么这种初始化的开销实际上很小。

如果foo是某个class的实例,您可以定义一个无操作的构造函数(可能是一个private:)并创建该类的函数friend。 如果foo是某个指针,则将其初始化为nullptr

BTW,这样的显式初始化使您的代码更容易可读并且不那么脆弱,甚至可能更加CPU cache友好。您可以添加注释,解释为什么以及如何不需要它。恕我直言,可读性的提高足以证明这种初始化的合理性。

我倾向于始终初始化本地化,让编译器有机会优化大部分无用的初始化。

或者(但我不建议)使用function specific pragma(如问题中所述)来禁用此类警告。