告诉 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(如您的问题中所述)来禁用此类警告。
当使用 -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(如您的问题中所述)来禁用此类警告。