为什么在for循环中没有初始化的声明没有任何警告?
Why is there not any warning on a declaration without initialization in a for loop?
我尝试使用g++ (gcc版本4.8.2 (Debian 4.8.2-1))编译以下代码,带有-Wall
标志(添加-Wextra
标志对我来说不会改变任何东西)。
#include <iostream>
using namespace std ;
int main() {
int i ;
cout << i << endl ;
}
它给出了这样的警告:
test.cpp: In function ‘int main()’:
test.cpp:7:13: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
cout << i << endl ;
但是下面的代码没有产生任何警告:
#include <iostream>
using namespace std ;
int main() {
for(int i ; i < 10 ; i++) {
cout << i << endl ;
}
}
我做了进一步的检查。
以下命令产生警告:
#include <iostream>
using namespace std ;
int main() {
int i ;
while(i<10) {
cout << i << endl ;
}
}
#include <iostream>
using namespace std ;
int main() {
int i ;
while(i<10) {
cout << i << endl ;
i++ ;
}
}
在上面的程序中,如果我用if
替换while
,那么我有一个警告。
对此有什么解释吗?为什么编译器在某些情况下可以识别问题,而在其他情况下却不能,尽管它们看起来非常接近?
感谢Pradhan提供了这个链接,我明白了这个问题。
该链接声明如下:
GCC能够警告用户使用未初始化变量的值。这样的值是未定义的,并且永远不会有用。它甚至不能作为一个随机值,因为它很少是一个随机值。不幸的是,在一般情况下,检测何时使用未初始化的变量等同于解决停止问题。GCC尝试通过使用优化器收集的信息来检测一些实例,并在命令行中给出-Wuninitialized选项时发出警告。在目前的执行中,有一些明显的缺点。首先,它仅在通过-O1、-O2或-O3启用优化时有效。第二,假阳性或假阴性的集合根据所启用的优化而变化。这也会导致在两个版本之间添加或修改优化时报告的警告的高度可变性。
实际上,当我添加这些标志之一时,编译器会产生警告。
相关文章:
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 我们可以在声明中的任何位置放置"typedef"说明符吗?
- 工会成员中的模板 - 声明没有声明任何内容
- 海湾合作委员会警告"没有声明任何东西
- 类 'MainWindow' 中未声明任何成员函数
- 外部模板:声明不声明任何内容
- 编译时类中未声明任何成员函数时出错
- 声明不声明任何[-fpermission]错误
- Cygwin g++和声明不声明任何内容
- 在标头中声明任何与 iostream 相关的对象会在尝试初始化时引发错误
- 使用 "interface" 时在类中未声明任何成员函数
- Cython 错误:声明不声明任何内容
- 如何可能在C++中的main()中不声明任何内容,却在编译后有一个可用的应用程序
- 为什么这个没有声明任何纯虚成员函数的类是抽象的?
- 无法将字符串转换为 int 作为回报。在 int 返回函数 getsocial() 中没有声明任何字符串变量
- 我是否应该声明任何可以为const的方法为const方法?
- 初始化const类成员,错误:声明没有声明任何内容
- 避免在 gperf 输出文件中避免"警告:声明 UserSuppliedStruct 不声明任何内容"