-2

在使用 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)是不够的,因为未初始化的警告是由 foo 的定义中的使用(例如比较)引起的test(),可能在另一个编译单元中,其中 pragma 不存在。

我也不想将编译指示放在 的定义中test(),因为问题不在于test(). test()当然不应该用随机垃圾调用,并且将 pragma 放在那里可能会导致其他错误被忽视。

有什么解决办法吗?

4

1 回答 1

2

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

int foo=0;

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

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

顺便说一句,这样的显式初始化使您的代码更具可读性和不那么脆弱,甚至可能对CPU 缓存更友好。您可以添加注释来解释为什么以及如何可能不需要它。恕我直言,可读性的提高足以证明这种初始化是合理的。

我倾向于总是初始化局部变量,让编译器有机会优化掉大部分无用的初始化。

或者(但我不建议这样做)使用特定于功能的编译指示 (如您的问题中所述)来禁用此类警告。

于 2017-06-06T06:25:29.623 回答