【问题标题】:Why isn't it possible in C to initialize a constant with another constant? [duplicate]为什么在 C 中不能用另一个常量初始化一个常量? [复制]
【发布时间】:2015-07-09 19:45:43
【问题描述】:

使用 gcc 编译以下代码。

代码:

#include <stdio.h>
const int i = 10;
const int n = i+1;
int main() {
    printf("%i\n", i);
    printf("%i\n", n);
}

错误:

我收到如下所示的编译错误

test.c:3:5: error: initializer element is not constant
const int n = i+1;
^

使用 g++ 编译可以正常工作并打印 10 和 11。

我用的是 gcc 4.9.2

【问题讨论】:

标签: c gcc


【解决方案1】:

const 变量可以用常量值(常量表达式)初始化。


  • C

在编译时,i + 1 不是常量表达式。

FWIW,甚至

const int n = i;

会报错,因为即使声明为 consti 也不能用作 常量表达式 来用作另一个 const 的初始化器。


  • C++

const 变量如果使用常量表达式初始化,则被视为常量表达式。所以,这是允许的。

【讨论】:

  • 但是 g++ 显然是在编译时计算 i+1 的。
  • @Thilo 好吧,在这种情况下,CC++ 是不同的语言,这样处理会更好。
  • "const 变量被当作常量表达式" -- If 它们用常量表达式初始化。
  • @BenjaminLindley 感谢先生的更正。已相应更新。
  • 是的,但是为什么
【解决方案2】:

static变量需要用常量初始化。
C++ 编译器会编译它,因为在 C++ 中,const 限定变量是常量。在 C 中,const 限定变量不是常量,C 编译器将引发错误。

【讨论】:

  • g++ 显然是在编译时计算i+1
  • @Thilo g++ 是一个 C++ 编译器,而在 C++ 中,常量的规则是不同的。在 C++ 中,可以使用在运行时评估的值来初始化常量。 c++ 中的 const 意味着一旦初始化就不能再改变它的值了。
  • @rozina:但这里不是这样。在这种情况下(对于 C++),i + 1 在编译时进行评估。 ii + 1n都是这段代码中的编译时常量表达式。
  • 这是错误的。它与 const 无关。 extern 和 static 变量在 main() 开始之前初始化,它们的值必须是常量表达式。在 C 中,与 C++ 不同,就“常量表达式”而言,extern const 变量不算作“常量”。你可以用任何你喜欢的方式初始化一个 const 局部变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多