为什么extern int n在声明n时(在不同的文件中)不编译static int n,但在声明时有效int n?(这两个声明都在文件范围内.)
基本上,为什么int n文件范围与同一范围不static int n一样?它只与extern有关吗?如果是这样,我错过了什么?
bma*_*ies 116
整个目的static是声明一个变量对于声明它的源文件是私有的.因此,它正在完成其防止外部连接的工作.
请记住,有四种文件范围变量定义:
int blah = 0; - blah在此文件中定义,可从其他文件访问.其他文件中的定义是重复的,会导致错误.extern int blah; - 必须在其他地方定义blah并从此文件中引用.int blah;- 这是FORTRAN的道德等同物COMMON.您可以在文件中包含任意数量的这些文件,链接器将它们全部解析为一个共享文件int.(*)static int blah;(可选择使用初始化程序) - 这是静态的.这个文件完全是私有的.它在其他文件中的externs是不可见的,你可以有许多不同的文件都声明static TYPE blah;,它们都是不同的.对于观众中的纯粹主义者:'file'= 编译单元.
请注意,静态内部函数(不在文件范围内)的范围更加严格:如果两个函数static int bleh = 0;甚至在同一个文件中声明,则它们是不相关的.
(*):对于那些你不熟悉的人:在通常的模式中,一个编译单元必须定义一个全局变量,其他人可以引用它.它"存在"在该编译单元中.在上面的情况(3)中,没有文件(或所有文件)定义它.如果有两个文件说int blah = 0;,链接器会抱怨多个定义.如果两个文件说int blah;链接器高兴地创建一个全局int并导致所有代码引用它.
在标准C中,在函数外部声明的变量有两个范围.一个static变量仅仅是宣布它的编译单元(即文件)中可见,和非静态变量在整个程序中可见.的extern声明说,该变量的位置尚不清楚,但会通过链接进行清理整顿; 它与非静态变量兼容,但extern static只是疯狂的谈话!
当然,在实践中,如今还有其他可见性.特别是,现在在单个源文件和整个程序之间存在范围界定; 单个共享库的级别是有用的(可通过GCC函数属性等机制设置).但这只是非静态变量主题的变化; static保持与以前相同的解释.