OpenEdv-开源电子网

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

关于变量定义的问题

[复制链接]

19

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-6-8
在线时间
114 小时
发表于 2018-7-9 10:50:05 | 显示全部楼层 |阅读模式
1金钱
在编程的时候经常碰到的问题,假设我在工程里有 led.c和 led.h文件,然后我在main.c中包含led.h,在led.c中同样包含led.h。在led.h中我定义了全局变量,int a = 0;,然后我在编译的时候,keil就会报错:
..\OBJ\LED.axf: Error: L6200E: Symbol i multiply defined (by led.o and main.o).
是说我在main.c和led.c中将 i 重复定义了,但是我需要在led.c和main.c中都使用 i 这个变量。
我现在在做法是在led.c中写,int i = 0;然后在led.h中使用extern再声明一遍i,extern in i;
但是这样定义变量太不方便,每次我需要新的全局变量的时候,我都要在.c文件中先定义,然后跑到.h文件中重新声明。
请问能不能在不使用extern情况下,可以在两个文件都使用i呢?

最佳答案

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

理想的方法是,绝对不要在H文件中定义变量。 正确的做法是: 在LED.c中定义:int i=0; 在LED.h中申明:extern int i; 养成一个习惯:这种全局变量,都是这样处理,C中定义一下,同名的H中申明一下。 这样,在你需要用到这个变量的C文件中,#include LED.h就可以,绝对不会报重复定义的错误,同时模块化和结构化也比较好。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-9 10:50:06 | 显示全部楼层
理想的方法是,绝对不要在H文件中定义变量。
正确的做法是:
在LED.c中定义:int i=0;
在LED.h中申明:extern int i;
养成一个习惯:这种全局变量,都是这样处理,C中定义一下,同名的H中申明一下。
这样,在你需要用到这个变量的C文件中,#include LED.h就可以,绝对不会报重复定义的错误,同时模块化和结构化也比较好。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-7-9 11:04:41 | 显示全部楼层
不行,不然拿extern来干嘛
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-7-9 11:29:40 | 显示全部楼层
传说中的static 定义~
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-7-9 15:24:29 | 显示全部楼层
没有看到你在main中是如何定义i的。如果你要使用.h中的变量,就要在使用的地方声明为extern。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 15:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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