找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10483|回复: 19
打印 上一主题 下一主题
收起左侧

如何在单片机上使用全局变量

  [复制链接]
跳转到指定楼层
楼主
ID:308173 发表于 2019-4-12 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在单片机中经常会遇到二个不同的.c文件需要使用同一个变量,但如何定义一个变量可以在不同的.c文件中使用呢?  当然是使用全局变量啦,可能有的人知道需要用extern来声明变量,当时总是编译错误,当然啦,我也是经常错误,才写这个笔记的啊

下面我先介绍一下怎么正确的使用,在贴几张错误使用全局变量的方法
如何正确的使用extern,实现main.c   led.c同时使用变量aaa

1在main.c中定义变量  int aaa=0;
2在led.c中定义 extern int aaa;(千万不要赋值)

这样就可以二个.c文件都可以使用aaa这个变量了,我之前为什么一直写错呢,我理解错了extern的作用,其实extern是告诉编译器这个变量在其他.c文件里面有了,取其他文件找就行了,哈哈,能搜到我这个的肯定是和我犯了一样的错误吧
现在贴几张错误的使用



显示提示有错误:ERROR L104: MULTIPLE PUBLIC DEFINITIONS


现在把extern int aaa=0;改为extern int aaa;结果如下


希望能帮到和我一样的单片机小白吧


评分

参与人数 2黑币 +65 收起 理由
tieq1952 + 15 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:253767 发表于 2019-4-13 07:16 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

板凳
ID:509148 发表于 2019-4-13 10:48 | 只看该作者
还有一种不要模块化,把所有子函数放在一个.c里面,然后定义变量主函数最上面定义的就是全局变量,在子函数里定义就是局部变量
回复

使用道具 举报

地板
ID:308173 发表于 2019-4-14 11:02 来自手机 | 只看该作者
hls123 发表于 2019-4-13 10:48
还有一种不要模块化,把所有子函数放在一个.c里面,然后定义变量主函数最上面定义的就是全局变量,在子函数 ...

你说的对,开始不会调用其他模块的变量我就是把所有模块放在一起写,不过这样写的话如果以后需要用这个模块就很不方便了,代码模块化以后调用起来特别方便
回复

使用道具 举报

5#
ID:308173 发表于 2019-4-14 11:03 来自手机 | 只看该作者
tieq1952 发表于 2019-4-13 07:16
谢谢分享!!!

不谢不谢
回复

使用道具 举报

6#
ID:553625 发表于 2019-7-27 10:36 | 只看该作者
能不能举个程序的例子呀 自己小白
回复

使用道具 举报

7#
ID:410689 发表于 2019-7-27 13:42 | 只看该作者
1在main.c中定义变量  int aaa=0;
2在led.c中定义 extern int aaa;(千万不要赋值)
第二点非常重要,赋值就会报错了
回复

使用道具 举报

8#
ID:164385 发表于 2021-11-17 21:27 | 只看该作者
明白了,谢谢
回复

使用道具 举报

9#
ID:819198 发表于 2021-11-18 10:05 | 只看该作者
学习了,“其实extern是告诉编译器这个变量在其他.c文件里面有了”重点
回复

使用道具 举报

10#
ID:608154 发表于 2021-11-20 19:59 来自手机 | 只看该作者
在led.c中,变量aaa不能赋值了,那有什么用
回复

使用道具 举报

11#
ID:562716 发表于 2021-11-20 20:34 | 只看该作者
常用变量直接建个变量声明文件?
回复

使用道具 举报

12#
ID:40039 发表于 2023-9-3 22:17 | 只看该作者

在led.c中,变量aaa不能赋值了,那有什么用

是的在其他文件中肯定要赋值的!
回复

使用道具 举报

13#
ID:224580 发表于 2023-9-3 23:09 | 只看该作者
感谢提供出来,我也为这个烦恼了很久,
回复

使用道具 举报

14#
ID:744809 发表于 2023-9-4 08:39 | 只看该作者
likejian 发表于 2023-9-3 23:09
感谢提供出来,我也为这个烦恼了很久,

其实最好不要用全局变量,你可以在a.c中定义一个static uint16_t  test = 0; 然后在a.c中写一个函数,uint16_t GetTest(void)
{
    return test;
}
这样写,一个模块最好只有几个外部接口,如果变量过多可以用一个结构体包含
回复

使用道具 举报

15#
ID:908826 发表于 2023-9-4 12:54 | 只看该作者
只可以有一个定义,但是可以有很多个声明
回复

使用道具 举报

16#
ID:378108 发表于 2023-9-5 19:35 | 只看该作者
吴作和 发表于 2021-11-20 19:59
在led.c中,变量aaa不能赋值了,那有什么用

不能在声明的时候赋值,C怎么学的啊
回复

使用道具 举报

17#
ID:1091094 发表于 2023-9-7 15:54 | 只看该作者
123156fsadf 发表于 2023-9-4 08:39
其实最好不要用全局变量,你可以在a.c中定义一个static uint16_t  test = 0; 然后在a.c中写一个函数,uin ...

为什么要这样写呢 觉得这样太麻烦了,一个全局变量直接搞定了
回复

使用道具 举报

18#
ID:40039 发表于 2023-10-14 10:00 | 只看该作者
wuxiaojia 发表于 2019-7-27 13:42
1在main.c中定义变量  int aaa=0;
2在led.c中定义 extern int aaa;(千万不要赋值)
第二点非常重要,赋值 ...

在程序中可以赋值,
aaa=0;

回复

使用道具 举报

19#
ID:1077009 发表于 2023-10-16 17:25 | 只看该作者
也可以在一个.c文件里面定义变量,然后在.h头文件里面extern 这个变量就可以,之后在用到这个变量的.c文件里面包含这个头文件
回复

使用道具 举报

20#
ID:1096316 发表于 2023-10-17 09:41 来自手机 | 只看该作者
谢谢,真的很需要
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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