C语言中外部变量的初始化

C语言中外部变量的初始化,c,C,我是C语言的新手。我读了Kernighan&Ritchie的书,发现外部变量只能用常量表达式初始化。为什么会这样?你能解释一下内部发生了什么吗?它们何时初始化?为什么我们不能使用之前定义的外部变量来初始化它呢?这里有一个链接可能会给你更好的解释。 他们有一个解释,我引用如下: extern int var = 0; int main(void) { var = 10; return 0; } 分析:猜猜这个程序能用吗?好了,又来了一个 来自C标准的惊喜。他们说..如果一个变量 声明,并且

我是C语言的新手。我读了Kernighan&Ritchie的书,发现外部变量只能用常量表达式初始化。为什么会这样?你能解释一下内部发生了什么吗?它们何时初始化?为什么我们不能使用之前定义的外部变量来初始化它呢?

这里有一个链接可能会给你更好的解释。

他们有一个解释,我引用如下:

extern int var = 0;
int main(void)
{
 var = 10;
 return 0;
}
分析:猜猜这个程序能用吗?好了,又来了一个 来自C标准的惊喜。他们说..如果一个变量 声明,并且该声明还提供了初始值设定项, 然后将分配该变量的内存,即该变量 将被视为已定义。因此,根据C标准 程序将成功编译并运行


希望这能有所帮助。

任何具有静态存储持续时间的对象,例如在函数外部声明的变量或在函数内部声明为静态的变量,只能用常量值初始化

其基本原因是可执行语句不能放在函数之外

如果未显式初始化此类对象,则算术类型的对象将初始化为零,指针类型的对象将初始化为空指针


常见的实现是将分配给具有静态存储持续时间的对象的值作为数据直接写入可执行映像,并与程序映像一起加载。

根据C99标准:第6.7.8节:

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

外部变量具有静态存储持续时间,因此必须由常量表达式或字符串文本初始化