langbaiyue 发表于 2014-2-20 14:26:41

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

同事离职,接手其工作,C文件有个接收数组,

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

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

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

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

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

编译环境 :keil 4.72.9.0   单片机stc12c5a60s2

enthier 发表于 2014-2-20 14:36:22

对于一般的编译器,全局和局部同名的话,在函数内部会先引用局部变量。

兄弟会十戒之首 发表于 2014-2-20 15:31:46

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

error_dan 发表于 2014-2-20 15:58:32

不会,这个标志只告诉编译器这个东西在外面定义,这里声明一下,需要将就着用的时候去外面找,好一点的编译器还会帮你去核对此处声明和外部定义的类型,有的编译则是是声明成什么样就当什么用~

gshuang1 发表于 2014-2-20 20:58:38

你的程序会完全不按照你的设想跑,数组越界访问会篡改其他变量的值,这是个大灾难。跟删不删除etern没关

unnormal 发表于 2015-5-8 13:33:48

学习了{:handshake:}{:handshake:}
页: [1]
查看完整版本: 请教:extern是否重新分配地址,