c – 可以将变量声明为static还是extern? - 代码日志

c – 可以将变量声明为static还是extern?

为什么以下不编译?

...
extern int i;
static int i;
...

但是如果你扭转了这个顺序,它会很好的编译。

...
static int i;
extern int i;
...

这里发生了什么?

在讨论宣布外部或内部联系的复杂性时,这是C标准中的一个例子。这在7.1.1.7节中有这样的作用:

static int b ; // b has internal linkage
extern int b ; // b still has internal linkage

extern int d ; // d has external linkage
static int d ; // error: inconsistent linkage

第3.5.6节讨论了extern应该在这种情况下的行为。

发生的是这样的:static int i(在这种情况下)是一个定义,其中static表示我有内部链接。当extern发生在静态后,编译器看到该符号已经存在,并接受它已经具有内部链接并继续执行。这就是为什么你的第二个例子编译。

另一方面,extern是一个声明,它隐含地表示该符号具有外部链接,但实际上并不创建任何内容。由于在第一个例子中没有我,编译器将我注册为具有外部链接,但是当它获取到静态时,它会发现不兼容的语句它具有内部链接并给出错误。

换句话说,这是因为声明比定义“软”。例如,您可以多次声明相同的事情而没有错误,但您只能定义一次。

这是否与C相同,我不知道(但是netcoder的下面的答案告诉我们,C标准包含相同的要求)。

http://stackoverflow.com/questions/14403796/can-a-variable-be-declared-both-static-and-extern

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 可以将变量声明为static还是extern?