为什么不会extern链接到一个静态variables?

为什么extern int n不是在声明了extern int n时候(在另外一个文件中)是static int n ,而是在声明为int n时工作? (这两个声明都在文件范围内。)

基本上,为什么int n在文件范围内与static int n不在同一个范围内? 这只是与extern有关吗? 如果是的话,那么我错过了什么?

static全部目的是声明一个variables对于声明的源文件来说私有的 。 因此,它正在做的工作是防止与外部的联系。

请记住,有四种风格的文件范围variables定义:

  1. int blah = 0; – blah在这个文件中定义,可以从其他文件访问。 其他文件中的定义是重复的,将导致错误。
  2. extern int blah; – 必须在别处定义,并从该文件引用。
  3. int blah; – 这是FORTRAN COMMON的道德等价物。 您可以在文件中包含任意数量的这些文件,并且链接器将其parsing为一个共享int 。 (*)
  4. static int blah; (可选的初始化) – 这是静态的。 这个文件是完全私有的。 对于其他文件中的extern是不可见的,并且你可以有许多不同的文件,所有的文件都声明为static TYPE blah; ,他们都是不同的

对于观众中的纯粹主义者:“文件”= 编译单元

请注意,静态内部函数(而不是在文件范围)的范围更为紧密:如果两个函数声明static int bleh = 0; 即使在同一个文件中,它们也是无关的。

(*):对于那些你不熟悉的人来说:在通常的模式下,一个编译单元必须定义一个全局variables,而其他编译单元可以引用它。 它“存在”在编制单位。 在上面的情况(3)中,没有文件(或所有文件)对其进行定义。 如果两个文件说int blah = 0; ,链接器会抱怨多个定义。 如果两个文件说int blah; 链接器高兴地创build一个单一的全局int并导致所有的代码引用它。

在标准C中,在函数之外声明的variables有两个范围。 staticvariables只在声明它的编译单元(即文件)中可见,非静态variables在整个程序中都是可见的。 一个extern声明说variables的位置还不知道,但是会被链接器sorting; 它与非静态variables兼容,但是extern static只是疯狂的说话!

当然,在实践中,这些日子还有其他的可见性。 特别是现在有一个单一的源文件和一个整个程序的范围水平, 单个共享库的级别是有用的(可以通过像GCCfunction属性这样的机制来设置)。 但这只是非静态variables主题的一个变种; static保持了以前的相同解释。

iv.c:2:1:错误:声明说明符中有多个存储类extern static int i; ^

这就是我们试图外部静态variables。 声明extern静态诠释我; – 类似于声明float int i; 你不能有float和int在同一个声明中出现吗? 同样,你不能在同一个声明中有外部和静态的。

根据MSDN文档:

在修改variables时,static关键字指定variables具有静态持续时间(在程序开始时分配,在程序结束时释放),并将其初始化为0,除非指定了另一个值。 在文件范围修改variables或函数时,static关键字指定variables或函数具有内部链接(其名称在声明的文件外部是不可见的)。

http://msdn.microsoft.com/en-us/library/s1sb61xd(v=vs.80).aspx:2013年 6月