告诉 GCC 假设一个对象被初始化

Tell GCC to assume an object is initialized

当使用 -Wall 在 GCC 中编译时,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() 当然不应该用随机垃圾调用,并且将 pragma 放在那里可能会导致其他错误被忽视。

有什么解决办法吗?

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

int foo=0;

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

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

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

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

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