OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3960|回复: 6

全局Const变量可以被另外C文件使用吗

[复制链接]

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-7
在线时间
23 小时
发表于 2020-10-24 10:26:27 | 显示全部楼层 |阅读模式
10金钱
比如说,在main.c定义
const int global_const=1;
在led.c:
第一种情况:
int a=global_const;
..\HARDWARE\LED\led.c(4): error:  #20: identifier "global_const" is undefined


第二种情况:
int const global_const;
int a=global_const;

..\HARDWARE\LED\led.c(4): error:  #28: expression must have a constant value


第三种情况:
extern int const global_const;
int a=global_const;

..\HARDWARE\LED\led.c(4): error:  #28: expression must have a constant value



第四种情况:
int const global_const;

..\OBJ\LCD.axf: Error: L6200E: Symbol global_const multiply defined (by led.o and main.o).

最佳答案

查看完整内容[请看2#楼]

第一、三、四种都是没有extern导致不能引入外部变量。 extern int const global_const; int a=global_const; 而第三种是因为全局变量a要在编译时赋值,所以需要一个常量而不能是变量; 这所以不能用变量对其赋值(即使这个变量在编译时已经赋值),是因为全局变量的值是在运行时确定的(进入main函数前由启动代码将其值从flash区复制过来)。 要想引入global_const变量值,a不能是全局变量,而是临时变量,即int a=glo ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-24 10:26:28 | 显示全部楼层
本帖最后由 ufbycd 于 2020-10-26 12:06 编辑

第一、三、四种都是没有extern导致不能引入外部变量。

extern int const global_const;
int a=global_const;

而第三种是因为全局变量a要在编译时赋值,所以需要一个常量而不能是变量;
这所以不能用变量对其赋值(即使这个变量在编译时已经赋值),是因为全局变量的值是在运行时确定的(进入main函数前由启动代码将其值从flash区复制过来)。

要想引入global_const变量值,a不能是全局变量,而是临时变量,即int a=global_const; 这句要放在函数体内。(临时变量在运行时赋值)
另外办法,将global_const定成常量即做成宏 #define global_const 1 使用就方便很多

回复

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-7
在线时间
23 小时
 楼主| 发表于 2020-10-26 13:22:49 | 显示全部楼层
ufbycd 发表于 2020-10-26 11:28
第一、三、四种都是没有extern导致不能引入外部变量。

extern int const global_const;

那第四种情况是为什么,虽变量同名都是全局变量,却在不同C文件,为何会出现重复定义的错误
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-26 13:34:32 | 显示全部楼层
15574944372 发表于 2020-10-26 13:22
那第四种情况是为什么,虽变量同名都是全局变量,却在不同C文件,为何会出现重复定义的错误

全局的局只有一个局——最终的可执行文件。编译器会在链接阶段将所有来自不同文件的全局变量链接在一起,所以只要同名就是重复。
回复

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-7
在线时间
23 小时
 楼主| 发表于 2020-10-26 13:51:15 | 显示全部楼层
ufbycd 发表于 2020-10-26 13:34
全局的局只有一个局——最终的可执行文件。编译器会在链接阶段将所有来自不同文件的全局变量链接在一起, ...

懂了,不过既然能链接在一起,那怎么还要extern声明才能用,是因为链接阶段在执行程序得到.O文件后面吗
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-26 15:23:50 | 显示全部楼层
15574944372 发表于 2020-10-26 13:51
懂了,不过既然能链接在一起,那怎么还要extern声明才能用,是因为链接阶段在执行程序得到.O文件后面吗

编译时先将每个.c文件编译出名字对应的.o文件,然后再将所有的.o文件链接成可执行文件。
extern就是告诉编译器,变量的原型要在别的.o文件里找。
回复

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-7
在线时间
23 小时
 楼主| 发表于 2020-10-28 19:47:20 | 显示全部楼层
ufbycd 发表于 2020-10-26 15:23
编译时先将每个.c文件编译出名字对应的.o文件,然后再将所有的.o文件链接成可执行文件。
extern就是告诉 ...

连续模式下DMA中断后DMA还会工作吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 04:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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