告诉 GCC 假设对象已初始化

Tell GCC to assume an object is initialized

本文关键字:初始化 对象 假设 GCC 告诉      更新时间:2023-10-16

当使用-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)之前是不够的,因为未初始化的警告源于 foo 在test()定义中的使用(例如比较),可能在另一个编译单元中,其中编译指示将不存在。

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

有什么解决办法吗?

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

int foo=0;

优化编译器(例如g++ -O2) 很可能在不需要时删除该初始化。顺便说一句,如果编译器在您的特定情况下没有对其进行优化,则此类初始化的开销非常小。

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

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

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

或者(但我不建议)使用特定于函数的杂注(如您的问题中所述)来禁用此类警告。