为什么这个不行无法分配变量C中的extern'd变量
extern int externed_variable;
int variable = externed_variable;
虽然这确实
extern int externed_variable;
int *variable_ptr = &externed_variable;
的编译器错误,我从前者得到的是“表达必须有一个恒定的价值“。我正在使用MSVC。
为什么这个不行无法分配变量C中的extern'd变量
extern int externed_variable;
int variable = externed_variable;
虽然这确实
extern int externed_variable;
int *variable_ptr = &externed_variable;
的编译器错误,我从前者得到的是“表达必须有一个恒定的价值“。我正在使用MSVC。
“表达必须有一个恒定的值”
,当你初始化一个变量,它应该是恒定的。
在这种情况下,
extern int externed_variable;
int variable = externed_variable;
你是一个“变量”和变量初始化得到的值运行时间。
但是,当你这样做:
extern int externed_variable;
int *variable_ptr = &externed_variable;
要指定地址,全局变量的地址是在编译的时候,因此,恒决定。 你可以用一个固定值初始化一个变量。
所以要回答你,因为全局变量的地址是在编译过程中分配的并且是常量,所以你不会收到错误!
全局初始化(更确切地说,使用静态生命周期的变量的初始化)需要整数常量,因为它们是在加载时完成的。
所有全局变量通常都粘在一起成为一个段,并且一次从二进制图像初始化。这只能在给C提供一个整型常量而不是变量引用时完成。
需要此标准的规则是6.7.9p4:
所有在具有静态 或线程存储时间应是常量表达式或字符串 文字对象的初始化表达式。由于错误说
这是什么范围? –
范围是全局的 – hacksoi
'extern'关键字告诉编译器像“不要'担心在这里找不到这个符号,它在其他地方声明,我们会让链接器找出它”。然后,当你在下一行使用它时,编译器会说“我不知道这是什么......” –