搜索
bottom↓
回复: 5

请教:extern是否重新分配地址,

[复制链接]

出0入4汤圆

发表于 2014-2-20 14:26:41 | 显示全部楼层 |阅读模式
同事离职,接手其工作,C文件有个接收数组,

1:
主程序 定义: unsigned char   receive_sbuf[8] ;
子程序 定义  extern unsigned char   receive_sbuf[8] ;

此时,该系统与上位机通讯正常。

2:
后来我将所有的函数整合成一个大函数,因为疏忽,在大函数中同时有
unsigned char   receive_sbuf[8] ;
extern unsigned char   receive_sbuf[8] ;
两个定义,编译器不报警,系统正常工作。

3:
后来将 extern unsigned char   receive_sbuf[8] ; 删掉,此时通讯不正常。

最重要的是:  在接收数据时,不限制接收字节数量,并且有  if(receive_sbuf[14] >0x12)  这样的判断条件,在1、2情况下正常  在3的情况下就不正常。

编译环境 :keil 4.72.9.0   单片机  stc12c5a60s2

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-2-20 14:36:22 | 显示全部楼层
对于一般的编译器,全局和局部同名的话,在函数内部会先引用局部变量。

出0入0汤圆

发表于 2014-2-20 15:31:46 | 显示全部楼层
楼上说的对,对于extern关键字,只是作为声明这个变量是别的文件中定义的,并没有非配内存给它.同时,你在你在子函数中的同名变量,默认会覆盖掉extern修饰的变量,所以不会报错.如果是全局作用域的变量你也弄同样的名字,那估计会出现命名错误.你试试看

出0入0汤圆

发表于 2014-2-20 15:58:32 | 显示全部楼层
不会,这个标志只告诉编译器这个东西在外面定义,这里声明一下,需要将就着用的时候去外面找,好一点的编译器还会帮你去核对此处声明和外部定义的类型,有的编译则是是声明成什么样就当什么用~

出70入0汤圆

发表于 2014-2-20 20:58:38 | 显示全部楼层
你的程序会完全不按照你的设想跑,数组越界访问会篡改其他变量的值,这是个大灾难。跟删不删除etern没关

出0入0汤圆

发表于 2015-5-8 13:33:48 | 显示全部楼层
学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 08:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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