翻译单元中的`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声明相同的变量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |