C 为什么将-Winit self与-Wuninitialized分开

C 为什么将-Winit self与-Wuninitialized分开,c,gcc,warnings,C,Gcc,Warnings,是关于让gcc编译器在您输入错误并用自身初始化变量时发出警告 事实证明,除了-Wuninitialized,您还需要: - Winit自我>代码>(C,C++,ObjuleC和Objul-C++)警告关于未初始化的变量,这些变量是用自身初始化的。注 此选项只能与-Wuninitialized选项一起使用,该选项在 turn仅适用于-O1及以上版本 我的问题是:为什么这不是-Wuninitialized的默认行为?如果您想警告未初始化的变量,而不是自初始化的变量,这同样麻烦,那么是什么用例呢?

是关于让gcc编译器在您输入错误并用自身初始化变量时发出警告

事实证明,除了
-Wuninitialized
,您还需要:

<代码> - Winit自我>代码>(C,C++,ObjuleC和Objul-C++)警告关于未初始化的变量,这些变量是用自身初始化的。注 此选项只能与

-Wuninitialized
选项一起使用,该选项在 turn仅适用于
-O1
及以上版本


我的问题是:为什么这不是
-Wuninitialized
的默认行为?如果您想警告未初始化的变量,而不是自初始化的变量,这同样麻烦,那么是什么用例呢?

这个bug报告似乎对此有一个解释(重点是我的):

我同意Andrew的观点,a(a)错误应该总是警告,它应该独立于-Winit self,它存在,因此-Wuninitialized不会警告关于自初始化自动变量以消除警告的常见(但有问题)实践


它可能称为可疑的实践,因为bug报告是C++错误报告。

这在初始化不重要时发生,例如一个比特填充32位数字(考虑通过已知排列置换另一个32位数字)。在这种情况下,初始化并不重要,可能会让人对算法的工作原理感到困惑,因此可以使用idom
uint32\u t val=val
向读者表明您有意不初始化该值。@SteveCox当然,我可以看到,但这仍然值得怀疑,因为这是未定义的行为,编译器可以用未定义的行为做一些奇怪的事情。当然,我实际上没有这样做,我刚刚在一些地方看到过它,人们想敦促编译器不要实际放入
xor eax,eax
,但仍然想隐藏一个未初始化的变量警告。@ShafikYaghmour:编译器编写者忽视了这样一个事实,即当标准未定义行为时,这意味着邀请实施者对他们的实施应该按照定义处理的情况进行判断,而不是邀请他们将判断抛到窗外。某些编译器编写者的行为只有在将其解释为后者时才有意义。
      int f()
      {
        int i = i;
        return i;
      }