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

我无法理解为什么这不起作用.

extern int i;

int main()
{
  printf(" %d ", i);  
}

static int i =3;

此外,这不起作用:

extern int i;

static int i =3;

int main()
{
  printf(" %d ", i);  
}

但是如果静态变量在extern声明之前定义它的工作原理:

static int i =3;

extern int i;

int main()
{
  printf(" %d ", i);  
}

正如我从extern int itells所理解的那样,我出现在其他地方,在这里它看起来如何(int i)

但是,其他地方意味着:

1)也许,稍后指向与全局变量相同的翻译单元.

2)也许,在其他一些转化单位.

我认为即使static int i = 3将i的范围限制在定义它的当前翻译单元,(1)也是有效的.

是不是静态int i = 3 global(我的意思是至少它在翻译单元中是可见的),尽管它的翻译单元的范围有限吗?那么为什么编译器无法找到呢?

当我编译前两个版本时,我得到以下编译时错误:

error: static declaration of ‘i’ follows non-static declaration
 note: previous declaration of ‘i’ was here

我无法理解此错误消息.另外,为什么它作为一个静态声明抱怨它不是一个定义呢?

C11 6.2.2标识符的链接第4节

For an identifier declared with the storage-class specifier extern in a scope in which a
prior declaration of that identifier is visible,31) if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage.

所以第二个声明将遵循第一个,回到你的例子,第一个和第二个例子我将有一个extern存储类.编译器认为这是一个错误.

虽然在第三个例子中,我将是静态的,因为静态首先显示.那应该没问题.

并且,在C11的第7节中6.2.2标识符的链接

If, within a translation unit, the same identifier appears with both internal and external
linkage, the behavior is undefined.

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

相关文章
相关标签/搜索