2017-06-20 62 views
2

为什么这个不行无法分配变量C中的extern'd变量

extern int externed_variable; 
int variable = externed_variable; 

虽然这确实

extern int externed_variable; 
int *variable_ptr = &externed_variable; 

的编译器错误,我从前者得到的是“表达必须有一个恒定的价值“。我正在使用MSVC。

+0

这是什么范围? –

+0

范围是全局的 – hacksoi

+2

'extern'关键字告诉编译器像“不要'担心在这里找不到这个符号,它在其他地方声明,我们会让链接器找出它”。然后,当你在下一行使用它时,编译器会说“我不知道这是什么......” –

回答

3

“表达必须有一个恒定的值”

,当你初始化一个变量,它应该是恒定的。

在这种情况下,

extern int externed_variable; 
int variable = externed_variable; 

你是一个“变量”和变量初始化得到的值运行时间。

但是,当你这样做:

extern int externed_variable; 
int *variable_ptr = &externed_variable; 

要指定地址,全局变量的地址是在编译的时候,因此,恒决定。 你可以用一个固定值初始化一个变量。

所以要回答你,因为全局变量的地址是在编译过程中分配的并且是常量,所以你不会收到错误!

+0

请参阅我对PSkocik的评论 – hacksoi

+0

@hacksoi当您声明一个全局变量并为其赋值时,变量将存储在代码段中,并存储在数据段中的初始值。运行程序时,变量将加载到RAM中,然后从DS中提取值。因此,您在链接时不会有价值。 – Swanand

+0

@Swanand理论上你可以在链接时获得值,但只有当你静态链接或者没有导出时。 – PSkocik

2

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

所有全局变量通常都粘在一起成为一个段,并且一次从二进制图像初始化。这只能在给C提供一个整型常量而不是变量引用时完成。

需要此标准的规则是6.7.9p4

所有在具有静态 或线程存储时间应是常量表达式或字符串 文字对象的初始化表达式。由于错误说

+0

在链接时不知道外部变量的值吗?为什么链接器不能解决它的价值? – hacksoi

+1

@hacksoi标准链接器仅处理标签和地址,AFAIK。他们不知道需要复制多少数据。我想这是可行的修改你的链接器和目标文件格式,让你做到这一点,但你可以用宏解决问题。 – PSkocik