0

例如,这两个语句之间是否有任何区别:

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

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

char a[5];

但不是

char a[4];
4

3 回答 3

1

extern int a[]声明aint具有未指定大小的数组,并被视为“不完整类型”(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):

所有引用相同对象或函数的声明都应具有兼容的类型;否则,行为是 undefined

于 2013-08-14T06:03:16.910 回答
0

以下:

extern char a[ ]; // (1)

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

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

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

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

于 2013-08-14T05:42:03.347 回答
-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
于 2013-08-14T05:42:35.957 回答