通过数组声明与定义长度不同时的结果,浅析编译逻辑
main.c#include <stdio.h>
extern int array;
extern void app(void);
int main()
{
printf("Hello World %d\n", (int)sizeof array);
app();
return 0;
}app.c
#include <stdio.h>
int array[] = {1,2,3,4,5,6};
void app(void)
{
printf("Hello World %d\n", (int)sizeof array);
}输出:
Hello World 16
Hello World 24说明:编译器按照当前源文件里声明的类型编译,并不会“自动”追溯到定义处。
这问题确实有意思,我也试试。 没有,他追溯了。只不过你这个截断了,告诉编译器你在其他地方定义一个数组,数组首地址是&array,元素个数是4,所以打印16. 编译原理的原因,每个文件都是先编译为一个个.o文件,然后通过链接器链接为输出文件,extern的都变为符号了,所以都是以声明为准
页:
[1]