C++ 为什么g++;关于未初始化变量的警告取决于变量的类型?(它警告整数,但不警告双精度)

C++ 为什么g++;关于未初始化变量的警告取决于变量的类型?(它警告整数,但不警告双精度),c++,g++,C++,G++,我目前正试图了解g++在哪些情况下警告未初始化的变量。考虑下面的代码: #include <iostream> typedef double barType; struct foo { barType bar; }; int main() { foo f; std::cout << f.bar << std::endl; } 但如果我将barType更改为int: $ g++ -O1 -Wall test.cc -o

我目前正试图了解g++在哪些情况下警告未初始化的变量。考虑下面的代码:

#include <iostream>

typedef double barType;

struct foo {

    barType bar;

};

int main() {

    foo f;

    std::cout << f.bar << std::endl;

}
但如果我将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.
谢谢


某人< /P> < P>猜测,他们可能更关心使用的未初始化的积分类型,而不是一个浮点或一个加倍,因为你可以使用带有指针偏移的积分类型而不需要铸造,这可能是非常糟糕的(TM)

< P> C++标准并没有强制这里的任何类型。因此,编译器可以自由地做任何他们喜欢的事情

在这里可以看到另一个好的观察结果:


这是未定义的行为,不需要诊断,因此编译器可以自由做出判断。他们本可以做得更好。

如果您使用-O编译,您可以得到此警告。我不太清楚原因,但如果我不得不猜测这是出于编译速度的目的,也就是说,为了优化,它已经需要弄清楚这一点,所以只有在您想要优化时才会报告

还有-Wuninitialized,它实际上不包括在“all”中,但无论如何它也需要-O。至少如果您进行了-Wuninitialized,编译器将警告您它无法警告您

cc1plus:warning:-Wuninitialized在没有-O的情况下不受支持


一个很好的例子是——墙的名字不好。“全部”中未包含其他-W选项。有关更多信息,请参阅文档。

未初始化的浮动与整数一样糟糕。如果是有意识地做出的,那是一个愚蠢的决定。当然,可能还有另一种解释。支持大卫的观点,即使最糟糕的情况是一个随机的位序列被用作双精度,这个位序列有时可能代表一个无穷大或NaN,有各种有趣的,每50000次执行一次的结果。
$ 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.
cc1plus: warning: -Wuninitialized is not supported without -O