4087|5

3471

帖子

13

TA的资源

五彩晶圆(高级)

楼主
 

extern:你怎么可以这样呢? [复制链接]

用库函数建了一个timer的工程。在主文件里引用外部变量factor。此变量在声明在stm32f10x_it.c中。主文件用extern引用。主文件extern char factor = 0;结果 Timerself.axf: Error: L6200E: Symbol factor multiply defined (by timerself.o and stm32f10x_it.o).
Timerself.axf: Not enough information to list image symbols.
Timerself.axf: Not enough information to list the image map.
若主文件extern  factor = 0;
Timerself.c(13): warning:  #260-D: explicit type is missing ("int" assumed)
Timerself.c:   extern  factor = 0;
后来改成extern  uint8_t factor。没错了。认为不允许引用的同时赋值(引用变量,再给它重新赋值有什么不合理)。认为是需要类型相同。可是,此时,外部定义的地方.it文件 中 改为char factor; 依然通过,类型都不匹配啊(这种情况下,能正常运行,结果正确) 。删除了.it文件,编译,出错,Timerself.axf: Error: L6218E: Undefined symbol factor (referred from timerself.o).看来主文件的extern 真的引用了char型的factor。如果主文件这样,extern   factor ;结果,Timerself.c(13): warning:  #260-D: explicit type is missing ("int" assumed)
Timerself.c:   extern   factor ;只能认为,引用时不许赋值,一旦赋值,extern就不起作用了。却可以改类型。错误类型倒没事。可以认为是引用一个变量,再为它重新定义类型。引用时赋值就认为是定义,extern就不起作用了。不说明类型也认为错,引用外部变量旨在改类型?什么逻辑嘛。

最新回复

主文件用extern引用。主文件extern char factor = 0 主文件同中断那个颠倒下试试。我也遇到过但,后来好了  详情 回复 发表于 2012-9-14 21:07
点赞 关注

回复
举报

7815

帖子

55

TA的资源

裸片初长成(中级)

沙发
 

标题

兄弟莫急,待我一点一点说明,着实此处兄弟多处有误解,故而疑惑。
首先,俺们要分清楚的是,你在it.c里的char factor这个不叫声明,它实实在在的就是定义。
而你在主函数里的引用,才叫声明。

这不是跟你掐字眼,而是要分清楚定义和声明的不同行为
定义一个变量,伴随着分配内存。
而声明仅仅,记住了,是仅仅只是引用一个符号,也就是常说的symbol
然后来说赋值就很好理解了,因为定义一个变量意味着分配内存,同时这个变量名也被赋予这段内存空间的首地址,故而,给一个地址赋值当然是允许的。
但是,引用则不然,因为它只是一个符号,不带内存地址啊,你说你给一个空落落的符号赋值它编译器能扰你嘛,,,,
所以最后一个问题也很容易理解,
因为他只是一个符号啊,它哪知道自己原来是一个什么型的变量?所以你爱写什么就是什么,,,.
不过兄弟小心了!
不管你声明怎么写,在你以后对这个变量操作的时候,人家只认它定义时的类型,为什么?
因为定义才意味着分配空间!
也许你会问,靠!那既然我用得时候它知道我是什么类型,我外部声明引用时它又不知道?!
嗯,这个问题非常精彩,它的解释是,对于编译器来说,你声明时,编译器把它视作一个符号,它只是告诉编译器,这个玩意是和外部源码编译出来的一个符号对应,程序编译好后,不管是变量还是程序机器码在内存上都表现为一段数据,而链接器链接它们时干的事就是根据各种地址,调用子函数,在变量存储的地域操作存储器就等同于操作变量,,,,
但是,当你在给一个变量赋值时,实际上变量名作为左值引用,左值一般是地址,
简而言之,此factor非彼factor,一为符号,他不知道自己是什么,二为地址,他知道自己在哪,知道自己是什么类型
 
个人签名

强者为尊,弱者,死无葬身之地

 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

板凳
 
刚才说让你小心,这是因为变量的类型以定义为准,分配行为发生了嘛!
所以你如果不慎或者故意声明为其他类型,然后你自己或者维护者误以为是另一种类型,那乱子可就闹大了,,,
嗯,这就是为什么我对这个问题说了这么多的原因,,每个人都会有第一次,,,,,,,就是痛了点,,,,,
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

4
 

标题

其实,这种语法上的多义性,也是c语言不够安全的原因之一,你说好端端的,都是变量,怎么左边就成了地址,右边就成了数据,,,当然一般情况下事还不大,但是遇到复杂的复合运算表达式,那就复杂了,要再加上c语言的优先级,结合性,那就是七国都没这么乱了,,,所以对此俺们的建议是,,,,,
打不过,,就跑,,没事干嘛写这么复杂的式子,咱一般不会跟人按行数算钱,,至于省那么几行,把又是乘的又是取地址搞不好还有成员运算放到一起么?
出来混都是要还的,,咱还是省省别人的脑细胞,也省省自己的脑细胞,生命有限,,当然,如果你是要去参加c语言混乱大赛,,当我没说过。,,
并且,,,有多乱给我好多乱,,,,,。加油……
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1万

帖子

16

TA的资源

版主

5
 

楼主把

主文件用extern引用。主文件extern char factor = 0

主文件同中断那个颠倒下试试。我也遇到过但,后来好了
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

6
 
非常感谢两位高手的指导!恢复的有些晚,真是不好意思啊,呵呵~~
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 13

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表