繁体   English   中英

翻译单元中的`static`定义和`extern声明`的顺序

[英]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 标识符的链接

如果在翻译单元内,同一标识符同时出现内部和外部链接,则行为未定义。

因此,最好不要在同一个翻译单元中同时使用staticextern声明相同的变量。

好吧,变量是externstatic 请记住,全局级别的static仅限制其对当前翻译单元的可见性,而extern指示它在不同的翻译单元中可见。

将某些东西称为static而又将其称为extern是没有意义的。 这样做是未定义的行为,所以不要这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM