无法将变量赋值给C中的extern'd变量

时间:2017-06-20 16:14:59

标签: c pointers extern

为什么这不起作用

extern int externed_variable;
int variable = externed_variable;

虽然这样做

extern int externed_variable;
int *variable_ptr = &externed_variable;

我从前者得到的编译器错误是“表达式必须具有常量值”。我正在使用MSVC。

2 个答案:

答案 0 :(得分:3)

  

“表达式必须具有常量值”

正如错误所说,初始化变量时,它应该是常量。

在这种情况下,

extern int externed_variable;
int variable = externed_variable;

您正在使用“变量”初始化,变量获取值运行时。

但是当你这样做时:

extern int externed_variable;
int *variable_ptr = &externed_variable;

您正在分配地址,全局变量的地址在编译时确定,因此,常量。 并且您可以使用常量值初始化变量。

所以回答你,在编译期间分配全局变量的地址并且是常量,你不会得到错误!

答案 1 :(得分:2)

全局初始化(更准确地说,具有静态生命周期的变量的初始化)需要整数常量,因为它们是在加载时完成的。

所有全局变量通常都粘在一起,并从二进制图像中一次初始化。只有在为C提供整数常量而不是变量引用时才能执行此操作。

需要此标准的规则是6.7.9p4

  

具有静态的对象的初始值设定项中的所有表达式   或线程存储持续时间应为常量表达式或字符串   文字。