繁体   English   中英

为什么关于未初始化变量的g ++警告取决于变量的类型? (它警告一个int但不是一个双)

[英]Why does g++ warning about uninitialized variable depend on the type of the variable? (it warns for an int but not for a double)

我目前正在尝试理解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.

谢谢,

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

猜测他们可能更关心使用未初始化的整数类型而不是浮点数或双精度,因为你可以使用带有指针偏移的整数类型而不进行强制转换可能非常糟糕(tm)

如果使用-O进行编译,可以发出警告。 我不是很清楚为什么,但如果我不得不猜测它是出于编译速度的目的,即它已经需要计算出来进行优化,所以只报告你想要优化的时候。

还有-ununitialized,实际上不包括在“all”中,但是那也需要-O。 至少如果你做了-Wuninitialized,编译器会警告你它不能警告你......

cc1plus: warning: -Wuninitialized is not supported without -O

从中可以看出一个很好的结果是 - 墙的命名很差。 “all”中不包含其他-W选项。 有关详细信息,请参阅文档。

C ++标准并没有强制要求任何类似的东西。 因此编译器可以自由地做任何他们喜欢的事情。

在这里看到另一个好的观察:

使用未初始化的变量和编译器(GCC)的乐趣

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM