我尝试使用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++ ;
}
}
在上述程序中,如果我将while
替换为if
,那么我会收到警告。
对此有一些解释吗?为什么编译器在某些情况下可以识别问题,而在其他情况下却没有,尽管它们看起来非常接近?
答案 0 :(得分:3)
感谢Pradhan给了this link,我理解了这个问题。
此链接指出以下内容:
GCC能够警告用户使用未初始化变量的值。这样的值是未定义的,它永远不会有用。它甚至不能用作随机值,因为它很少是随机值。不幸的是,在一般情况下,检测何时使用未初始化的变量等同于解决停止问题。 GCC尝试使用优化器收集的信息检测某些实例,并在命令行中给出-Wuninitialized选项时对其进行警告。目前的实施存在许多缺点。 首先,它仅在通过-O1,-O2或-O3启用优化时有效。其次,误报或负数的集合根据启用的优化而变化。这也会导致在发布之间添加或修改优化时报告的警告的高度可变性。
实际上,当我添加其中一个标志时,编译器会发出警告。