在使用extern声明数组时指定其大小是否有所不同?

时间:2013-08-14 05:29:51

标签: c arrays declaration

e.g。 这两个陈述之间有什么区别:

extern char a[];
extern char a[4];

如果(在另一个源文件中)的真实定义是

,该怎么办?
char a[5];

但不是

char a[4];

3 个答案:

答案 0 :(得分:1)

extern int a[]a声明为具有未指定大小的int数组,并被视为“不完整类型”(C.11§6.7.6.2¶4)。不完全类型是指没有足够信息来确定其大小的类型(C.11§6.2.5¶1)。 extern的使用意味着名称具有“外部联系”(C.11§6.2.2¶4)。程序中所有引用与外部链接同名的引用都指向同一个对象(C.11§6.2.2¶2)。

如果您有extern int a[4],但在其他地方定义为int a[5],那么这将导致未定义的行为(C.11§6.2.7¶2):

  

引用同一对象或函数的所有声明都应具有兼容类型;否则,行为未定义

答案 1 :(得分:0)

以下内容:

extern char a[ ]; // (1)

...意思是:“去找一个名为a的字符数组,它存在。”,而:

extern char a[ c ]; // (2), where c is some constant.

...意思是:“去找一个名为a的大小字符数组(char * c),它存在。”。

两个声明的实际示例:如果已知数组的大小,则应该执行第二个声明。如果你的数组是VLA,那么它应该使用第一个声明来声明。

答案 2 :(得分:-2)

我明白了,“extern”语句只是c编译器的“声明语句”。

“extern char a [4]”的“4”什么都没有。 C编译器不使用“4”;

请注意以下事项:

source a : extern char a[4]
source b:  char[5]

gcc 4.6.3 compile result : ok
running result : ok