[英]Order of `static` definition and `extern declaration` in a translation unit
我无法理解为什么这不起作用。
extern int i;
int main()
{
printf(" %d ", i);
}
static int i =3;
此外,这不起作用:
extern int i;
static int i =3;
int main()
{
printf(" %d ", i);
}
但是如果static
变量在extern declaration
之前定义它的工作原理:
static int i =3;
extern int i;
int main()
{
printf(" %d ", i);
}
据我所知从extern int i
告诉i
在其他地方 ,这里看起来如何( int i
)
但是, 其他地方意味着:
1)也许,稍后指向same
global variable
same
翻译单元。
2)也许,在other
一些转化单位。
我认为(1)
即使static int i = 3
限制了i
的范围到当前定义它的翻译单元也是有效的。
是不是static int i =3
global
(我的意思是至少它在翻译单元中是可见的),尽管它的翻译单元的范围有限吗? 那么为什么编译器无法找到呢?
当我编译前两个版本时,我得到以下编译时错误:
error: static declaration of ‘i’ follows non-static declaration
note: previous declaration of ‘i’ was here
我无法理解此错误消息。 另外,为什么它作为一个静态declaration
抱怨它不是一个definition
呢?
C11 6.2.2 标识符的链接第4节
对于在范围内使用存储类说明符extern声明的标识符,其中该标识符的先前声明是可见的,31)如果先前声明指定内部或外部链接,则后面声明中标识符的链接与在先前声明中指定的联系。 如果没有先前声明可见,或者先前声明未指定链接,则标识符具有外部链接。
所以第二个声明将遵循第一个,回到你的例子,第一个和第二个例子i
将有一个extern
存储类。 编译器认为这是一个错误。
虽然在第三个例子中, i
将是static
因为static
首先显示。 那应该没问题。
并且,在C11的第7节中6.2.2 标识符的链接
如果在翻译单元内,同一标识符同时出现内部和外部链接,则行为未定义。
因此,最好不要在同一个翻译单元中同时使用static
和extern
声明相同的变量。
好吧,变量是extern
或static
。 请记住,全局级别的static
仅限制其对当前翻译单元的可见性,而extern
指示它在不同的翻译单元中可见。
将某些东西称为static
而又将其称为extern
是没有意义的。 这样做是未定义的行为,所以不要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.