硬汉嵌入式论坛

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

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

[复制链接]

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 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万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

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

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 02:09 , Processed in 0.267334 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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