【问题标题】:Initializing variable with itself: how come it is not a compile-time error? [duplicate]用自身初始化变量:为什么不是编译时错误? [复制]
【发布时间】:2014-01-16 11:13:40
【问题描述】:

我有点困惑,我不小心写了与这个等效的代码

int a=a; // there is not a declared before this line

并且编译器很高兴地编译了它——gcc 和 clang,它们都非常符合标准并且具有良好的诊断能力。 (使用-Wall,gcc 4.8 会警告未初始化的变量;clang 不会)。

我认为分配的 RHS 将在 LHS 之前进行评估,因此导致 a 在 RHS 上未定义。我可以简单说明一下为什么这在语法上是合法的吗?

【问题讨论】:

  • 但是你没有收到这样的警告warning C4700: uninitialized local variable 'a' used
  • 虽然你说“赋值的 RHS 将在 LHS 之前进行评估”,但我认为这是忽略了这也是一个内联变量声明的事实。它相当于int a; a = a;,这是我对编译器实际在做什么的猜测。
  • 我只收到了带有-Wall的gcc警告。

标签: c syntax


【解决方案1】:

如果你告诉 GCC 这样做,这将是一个编译时错误:

gcc -Winit-self -Werror

请注意,遗憾的是,大多数常见的嫌疑人(如 -Wall)并未启用此诊断。

【讨论】:

  • 这个问题更多的是关于 if+为什么这个构造在 C 中是合法的 - 我将编辑这个问题以澄清这一点。
  • 这是一个未初始化的变量。这在 C 中是合法的,编译器不需要发出任何诊断。但是这个结构是无意义的,可能是一个错误,所以编译器能够警告它。
  • 如果地址未被占用,则在 C 中使用未初始化的自动对象不再合法。根据 C 2011 6.3.2.1 2,行为未定义。
【解决方案2】:

名称的范围在其完整声明之后立即开始。因此,a 在其初始化时已经在作用域内。

Stroustrup 的示例与您提到的用于演示范围规则的示例完全相同。

请参阅:Stroustrup “C++ 编程语言,第 4 版”,第 158 页。

编辑: 糟糕,没有注意到问题被标记为“C”,但我认为它也适用于 C

【讨论】:

  • 别担心,我原来在 c++ 程序中有那个程序 ;)
猜你喜欢
  • 2012-08-31
  • 2013-10-08
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多