一个简单的程序:
int main()
{
long i = i;
return 0;
}
以 C 编译没有错误和警告。
$ gcc -Wall -Wextra -pedantic 1.c
使用C++编译时会出现警告:
$ c++ -Wall -Wextra -pedantic 1.c
1.c: In function ‘int main()’:
1.c:3:7: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
long i = i;
在这两种情况下,变量i似乎都是0,尽管在C++中它可能未初始化。我实际上在一个函数中犯了这样的笔误,找到它相当困难。我该怎么做才能避免这种情况?我希望至少能得到一个警告。此外,Clang在任何情况下(C或C++)都没有给出任何警告。是否有标准的特定部分说明了这种行为?
编辑:尝试过类似的事情:
$ cat 1.c
int main(void)
{
int k = k + 0;
int i = i + 1;
return 0;
}
警告(在C语言中)仅针对“i”生成。
$ gcc -Wall -Wextra 1.c
1.c: In function ‘main’:
1.c:4:6: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
int i = i + 1;
i = i
是一个无操作,但是int i = i;
不是一个赋值,它意味着完全不同的事情。int i = i;
没有警告是非常有意义的,请参阅 GCC 文档中的-Winit-self
。自初始化是传统的 C 习惯用法,用于避免未初始化的警告,因此 GCC 默认不会发出警告。 - Jonathan Wakely