6

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

extern int i;

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

static int i =3;

此外,这不起作用:

extern int i;

static int i =3;

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

但是如果static变量是在extern declaration它起作用之前定义的:

static int i =3;

extern int i;

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

据我了解extern int ii它存在于其他地方,在这里它看起来像(int i

但是,在其他地方意味着:

1)也许,稍后在same翻译单元中指向一个global variable.

2)也许,在某个other翻译单元中。

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

不是static int i =3 global(我的意思是至少它在翻译单元中可见)在这里,即使它的翻译单元的范围受到限制?那为什么编译器找不到呢?

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

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

我无法理解此错误消息。另外,为什么它会抱怨它是静态declaration的,不是definition吗?

4

3 回答 3

6

C11 6.2.2标识符的链接第 4 节

对于在一个范围内使用存储类说明符 extern 声明的标识符,该标识符的先前声明是可见的,31) 如果先前声明指定内部或外部链接,则后面声明的标识符的链接与先前声明中指定的链接。如果前面的声明不可见,或者前面的声明没有指定链接,则标识符具有外部链接。

因此,第二个声明将遵循第一个声明,回到您的示例,第一个和第二个示例i将具有extern存储类。编译器认为这是一个错误。

而在第三个例子中,i将是static因为static首先显示。那应该没问题。

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

如果在翻译单元内,相同的标识符同时出现在内部和外部链接中,则行为未定义。

static所以最好不要在同extern一个翻译单元中声明同一个变量。

于 2013-08-09T08:33:15.330 回答
2

好吧,一个变量是externor static。请记住,static在全局级别将其可见性限制为仅对当前翻译单元,而extern规定它在不同翻译单元中可见。

于 2013-08-09T07:50:01.040 回答
0

static将某事一次又一次地声明为 是没有意义的extern。这样做是未定义的行为,所以不要这样做。

于 2013-08-09T07:50:31.710 回答