emwin 发表于 2021-9-6 14:00:12

通过数组声明与定义长度不同时的结果,浅析编译逻辑

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说明:编译器按照当前源文件里声明的类型编译,并不会“自动”追溯到定义处。




eric2013 发表于 2021-9-6 19:59:42

这问题确实有意思,我也试试。

庄永 发表于 2021-9-6 20:27:24

没有,他追溯了。只不过你这个截断了,告诉编译器你在其他地方定义一个数组,数组首地址是&array,元素个数是4,所以打印16.

WZH 发表于 2021-9-7 10:56:11

编译原理的原因,每个文件都是先编译为一个个.o文件,然后通过链接器链接为输出文件,extern的都变为符号了,所以都是以声明为准
页: [1]
查看完整版本: 通过数组声明与定义长度不同时的结果,浅析编译逻辑