找回密码
 立即注册

QQ登录

只需一步,快速开始

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

容易出错!C语言中的外部变量关键词extern可不能随便使用

[复制链接]
跳转到指定楼层
楼主
本文介绍c语言中关键词extern用法的一个注意事项。
在做项目开发时,在一个单片机C语言程序(用keil开发)中,如果有两个C文件,在其中一个C文件(设为a文件)定义了一个全局变量v,并在此文件里的程序段里修改此变量,在另外一个C文件(设为b文件)里用外部变量(extern)的方法引用此变量,并读取变量v,但是,在b中读取时结果变量v出错,出现乱值。
什么原因?
v在b文件里作为外部变量,被认为分配的地址在其他地方,在b文件里只是读取没有写入,实际就没有分配内存地址,从而出错。

怎么修改?
方法1,在b文件中定义此变量v,在a文件中用外部变量的方式引用变量v,在a文件里修改变量v,在b文件中回读变量v,结果正常。
这样,在b文件里定义了变量v,分配了内存地址,在a文件中引用外部变量v并进行了写入操作,也分配了内存地址,所以不出错。

方法2,最优方法,在一个c文件(如a.c)里定义全局变量v,在其h文件(a.h)里再引用为外部变量,在用到变量v的其他c文件里include a.h,这样的话不管是否读写都无问题。当然,a.c里也要include a.h。

注意:全局变量才能被外部引用,静态变量和局部变量不行的。

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

使用道具 举报

沙发
ID:491577 发表于 2023-3-25 13:15 | 只看该作者
正常都是用.h文件作为多个.c文件的连接,一个项目有多个.c文件就是为了使用c文件里的函数和全局变量。如果有3个以上c文件用到同一个全局变量你的第一个方法就没用了。
回复

使用道具 举报

板凳
ID:1068313 发表于 2023-3-25 17:46 | 只看该作者
说到底,就是不规范书写
回复

使用道具 举报

地板
ID:378108 发表于 2023-3-25 18:21 | 只看该作者
你的观点是错误的,B.C只是不知道 A.C改变了这个数据而已,这个变量本身就是同一个变量,又不是两个,他们的地址是一个!!!
这个一般是优化引起的问题,你可以降低优化,或 给变量加上 volatile 说明这个变量会被其他程序改变.
运行的程序,是连接后的一个整体,它可不知道你有几个文件.

评分

参与人数 1黑币 +5 收起 理由
diyage + 5 赞一个!

查看全部评分

回复

使用道具 举报

5#
ID:63113 发表于 2023-3-27 11:20 | 只看该作者
zhxzhx 发表于 2023-3-25 18:21
你的观点是错误的,B.C只是不知道 A.C改变了这个数据而已,这个变量本身就是同一个变量,又不是两个,他们的地 ...

感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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