作者:Maugham | 来源:互联网 | 2022-12-03 19:56
1> rici..:
对于GCC编译C程序,您需要添加编译器标志-Winit-self
.(你还需要-Wall
或者-Wuninitialized
,见下文.)对于GCC编译C++程序,这个标志是隐含的,-Wall
但对于C,它需要明确指定; 它不属于-Wextra
任何一部分.
对于Clang来说,情况稍微有点儿了.在OP的片段中,Clang不会产生任何诊断.但是,使用下面GCC手册中提供的略有不同的片段,提供了诊断:
int f() {
int i = i;
return i;
}
不同之处在于,在上面的片段中,i
实际使用了(未初始化的)值.显然,在原始代码中,Clang检测到变量是无用的,并在应用诊断之前将其作为死代码消除.
在Clang中,诊断由触发-Wuninitialized
,由-Wall
GCC 启用.
以下是GCC手册的摘录:
-Winit-self
(仅限C,C++,Objective-C和Objective-C++)
警告用自己初始化的未初始化变量.请注意,此选项只能与-Wuninitialized
选项一起使用.
例如,GCC警告i
只有在-Winit-self
指定时才会在以下代码段中未初始化:
int f()
{
int i = i;
return i;
}
-Wall
在C++中启用此警告.
如摘录所示,-Wuninitialized
也是必需的.在C和C++中,-Wall
暗示着-Wuninitialized
.但请注意,除非还要求某些优化级别,否则将无法检测到许多未初始化的用途.(-Winit-self
据我所知,这不适用.可以在没有优化的情况下检测到.)
令人恼火的是,当您将问题标记为重复时,先前标记的重复项将消失.我没有标记它,因为没有一个重复实际上回答了正文中的问题; 我还编辑了标题.
作为参考,这里是原始的重复,可能是有意义的:
为什么编译器允许自己初始化变量?
gcc没有警告未初始化的变量
为什么c ++编译器接受这个初始化?static int x = x;
在C++ 14中,C++标准是否在使用不确定值和未定义行为方面发生了变化?