【发布时间】:2013-08-14 05:29:50
【问题描述】:
例如 这两种说法有什么区别吗:
extern char a[];
extern char a[4];
如果 a(在另一个源文件中)的真正定义是
char a[5];
但不是
char a[4];
【问题讨论】:
标签: c arrays declaration
例如 这两种说法有什么区别吗:
extern char a[];
extern char a[4];
如果 a(在另一个源文件中)的真正定义是
char a[5];
但不是
char a[4];
【问题讨论】:
标签: c arrays declaration
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):
引用同一对象或函数的所有声明都应具有兼容的类型;否则,行为未定义。
【讨论】:
以下内容:
extern char a[ ]; // (1)
... 的意思是:“去某个地方寻找一个叫做 a 的字符数组,它存在。”,而:
extern char a[ c ]; // (2), where c is some constant.
... 意思是:“去某个地方寻找一个大小为 (char * c) 的字符数组,称为 a,它存在。”。
两种声明的实际示例:如果数组的大小已知,您应该进行第二次声明。如果你的数组是一个 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
【讨论】:
sizeof a,编译器可能会使用4。