【发布时间】:2014-02-07 04:51:36
【问题描述】:
我是 C 的新手。我正在阅读 Kernighan & Ritchie 的书,发现外部变量只能使用常量表达式进行初始化。为什么会这样?你能解释一下内部发生了什么吗?他们什么时候初始化?为什么我们不能使用之前定义的变量来初始化外部变量?
【问题讨论】:
标签: c
我是 C 的新手。我正在阅读 Kernighan & Ritchie 的书,发现外部变量只能使用常量表达式进行初始化。为什么会这样?你能解释一下内部发生了什么吗?他们什么时候初始化?为什么我们不能使用之前定义的变量来初始化外部变量?
【问题讨论】:
标签: c
根据 C99 标准:第 6.7.8 节:
具有静态存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串字面量。
并且外部变量具有静态存储时长,所以必须用常量表达式或字符串字面量来初始化。
【讨论】:
这里有一个链接可能会给你更好的解释。 http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/
他们有我在下面引用的解释:
extern int var = 0;
int main(void)
{
var = 10;
return 0;
}
分析:猜猜这个程序会起作用吗?嗯,又来了一个 C标准的惊喜。他们说..如果一个变量只是 声明,并且该声明还提供了一个初始化程序, 然后将分配该变量的内存,即该变量 将被视为已定义。因此,根据 C 标准,这 程序将成功编译并运行。
希望这会有所帮助。
【讨论】:
任何具有静态存储持续时间的对象,例如在函数外部声明的变量或在函数内部声明为静态的变量,都只能使用常量值进行初始化。
这样做的基本原因是可执行语句不能放在函数之外。
如果这些对象没有显式初始化,那么对于算术类型,它们将被初始化为零,对于指针类型,它们被初始化为空指针。
常见的实现是将分配给具有静态存储持续时间的对象的值作为数据直接写入可执行映像并与程序映像一起加载。
【讨论】: