告诉 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)
之前是不够的,因为未初始化的警告源于 foo 在test()
定义中的使用(例如比较),可能在另一个编译单元中,其中编译指示将不存在。
我也不想把编译指示放在test()
的定义中,因为问题不在于test()
。test()
当然不应该被随意称为垃圾,将编译指示放在那里可能会导致其他错误被忽视。
有什么解决办法吗?
最简单的解决方案是(冗余地)初始化该变量,例如通过添加:
int foo=0;
优化编译器(例如g++ -O2
) 很可能在不需要时删除该初始化。顺便说一句,如果编译器在您的特定情况下没有对其进行优化,则此类初始化的开销非常小。
如果foo
是某个class
的实例,则可以定义一个无操作构造函数(可能是private:
构造函数)并使函数friend
该类。 如果foo
是某个指针,则将其初始化为nullptr
。
顺便说一句,这样的显式初始化使您的代码更具可读性,不那么脆弱,甚至可能更适合 CPU 缓存。您可以添加注释,解释为什么以及如何不需要它。恕我直言,可读性的提高足以证明这种初始化是合理的。
我倾向于总是初始化局部变量,让编译器有机会优化大多数无用的初始化。
或者(但我不建议)使用特定于函数的杂注(如您的问题中所述)来禁用此类警告。
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?