为什么这不起作用
extern int externed_variable;
int variable = externed_variable;
虽然这样做
extern int externed_variable;
int *variable_ptr = &externed_variable;
我从前者得到的编译器错误是“表达式必须具有常量值”。我正在使用MSVC。
答案 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:
具有静态的对象的初始值设定项中的所有表达式 或线程存储持续时间应为常量表达式或字符串 文字。