C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了翻译单元中的`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节

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

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

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

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

大佬总结

以上是大佬教程为你收集整理的翻译单元中的`static`定义和`extern声明`的顺序全部内容,希望文章能够帮你解决翻译单元中的`static`定义和`extern声明`的顺序所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。