e.g。 这两个陈述之间有什么区别:
extern char a[];
extern char a[4];
如果(在另一个源文件中)的真实定义是
,该怎么办?char a[5];
但不是
char a[4];
答案 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