我目前正在尝试了解g ++在哪些情况下警告未初始化的变量。请考虑以下代码:
#include <iostream>
typedef double barType;
struct foo {
barType bar;
};
int main() {
foo f;
std::cout << f.bar << std::endl;
}
如果我像这样编译它,我没有得到任何警告:
$ g++ -O1 -Wall test.cc -o test
但如果我将barType更改为int:
$ g++ -O1 -Wall test.cc -o test
test.cc: In function ‘int main()’:
test.cc:17: warning: ‘f.foo::bar’ is used uninitialized in this function
警告如何取决于类型?在这两种情况下都没有初始化。
我正在使用:
$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
谢谢,
有人
答案 0 :(得分:11)
这是未定义的行为,不需要诊断,因此编译器可以自由判断。他们本可以做得更好。
答案 1 :(得分:1)
猜测他们可能更关心使用未初始化的整数类型而不是浮点数或双精度因为你可以使用带有指针偏移的整数类型而不进行强制转换可能非常糟糕(tm)
答案 2 :(得分:1)
如果使用-O进行编译,可以发出警告。我不是很清楚为什么,但如果我不得不猜测它是出于编译速度的目的,即它已经需要计算出来进行优化,所以只报告你想要优化的时间。
还有-ununitialized,实际上并没有包含在“all”中,但是无论如何也需要-O。至少如果你做了-Wuninitialized,编译器会警告你它不能警告你...
cc1plus: warning: -Wuninitialized is not supported without -O
从中可以看出一个很好的结果是 - 墙的命名很差。 “all”中不包含其他-W选项。有关详细信息,请参阅文档。
答案 3 :(得分:0)
C ++标准并没有强制要求任何类似的东西。所以编译器可以自由地做任何他们喜欢的事情。
在这里看到另一个好的观察: