硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1189|回复: 3
收起左侧

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

[复制链接]

218

主题

1106

回帖

1770

积分

至尊会员

More we do, more we can do.

积分
1770
发表于 2021-9-6 14:00:12 | 显示全部楼层 |阅读模式
main.c
  1. #include <stdio.h>

  2. extern int array[4];
  3. extern void app(void);

  4. int main()
  5. {
  6.     printf("Hello World %d\n", (int)sizeof array);
  7.     app();
  8.     return 0;
  9. }
复制代码
app.c
  1. #include <stdio.h>

  2. int array[] = {1,2,3,4,5,6};

  3. void app(void)
  4. {
  5.     printf("Hello World %d\n", (int)sizeof array);
  6. }
复制代码
输出:
Hello World 16
Hello World 24
说明:编译器按照当前源文件里声明的类型编译,并不会“自动”追溯到定义处。




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2021-9-6 19:59:42 | 显示全部楼层
这问题确实有意思,我也试试。
回复

使用道具 举报

85

主题

784

回帖

1039

积分

至尊会员

积分
1039
发表于 2021-9-6 20:27:24 | 显示全部楼层
没有,他追溯了。只不过你这个截断了,告诉编译器你在其他地方定义一个数组,数组首地址是&array[0],元素个数是4,所以打印16.
回复

使用道具 举报

15

主题

176

回帖

236

积分

高级会员

积分
236
发表于 2021-9-7 10:56:11 来自手机 | 显示全部楼层
编译原理的原因,每个文件都是先编译为一个个.o文件,然后通过链接器链接为输出文件,extern的都变为符号了,所以都是以声明为准
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-11 07:11 , Processed in 0.221105 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表