【发布时间】:2017-11-13 18:30:50
【问题描述】:
我想这可能以前已经回答过了。如果有请标记为重复!
我无法理解 extern 对局部变量(或局部函数!)的含义。我似乎看不出它在功能上与 static 局部变量有何不同...例如:
int foo(void) {
extern int i;
return i++;
}
int bar(void) {
static int i;
return i++;
}
AFAICT,foo 和 bar 是相同的。根据 C99 规范,与 bar 中的 i 相比,foo 中的 i 应该具有外部链接。也就是说,我想不出任何方法来利用该外部链接 - 因为它是一个局部变量,所以在 foo 之外无法访问它,更不用说在文件之外了。
我确定我在这里遗漏了一些东西 - 它是什么?
编辑
感谢所有指出我在 extern 和 static 上缺少类型的人。你说得很对。作为 SO 的常见回答者,我现在理解在这种疏忽之后一连串反对票的挫败感。
【问题讨论】:
-
foo只有i的声明。所以它必须在某个带有外部链接的地方定义。就像foo访问i一样,其他一些函数也可以访问i。 -
在这种情况下,
extern i;只是一个声明而不是一个定义。这不会编译。 rextester.com/AMSELK81614 -
@Stargateur:如果
i声明了一个类型,它确实会编译。如果没有另一个包含i的定义 具有外部链接和相同类型的翻译单元,它根本无法构建有效的程序。 -
你指定了c99标签,但你使用隐式int?
-
extern i;和static i;在现代 C 语言中都无效,从 C99 开始。并且您标记了您的问题 [c99]。