例如,这两个语句之间是否有任何区别:
extern char a[];
extern char a[4];
如果(在另一个源文件中)的真正定义是
char a[5];
但不是
char a[4];
例如,这两个语句之间是否有任何区别:
extern char a[];
extern char a[4];
如果(在另一个源文件中)的真正定义是
char a[5];
但不是
char a[4];
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):
所有引用相同对象或函数的声明都应具有兼容的类型;否则,行为是 undefined。
以下:
extern char a[ ]; // (1)
... 意思是:“去某个地方寻找一个称为 a 的字符数组,它存在。”,而:
extern char a[ c ]; // (2), where c is some constant.
... 意思是:“去某个地方寻找一个称为 a 的大小为 ( char * c ) 的字符数组,它存在。”。
两种声明的实际示例:如果数组的大小已知,则应该进行第二次声明。如果你的数组是一个 VLA,那么它应该使用第一个声明来声明。
我已经理解,“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