请教一个简单的C语言相等判断问题

2019-12-22 13:50发布

<p> 被一个简单的问题搞蒙了,折腾了一晚上没解决,特来请教。</p><br><p> 在STM32F401上做过一个串口接收的程序,运行没问题。现在要移植到F103上,发现接收数据正确,用“==“判断却不相等。编译器是IAR 7.70.1</p><br><p> 在F401上判断0XA5,0X5A作为接收标志,接收判断没问题。在F103上接收正确,判断不能通过。后来改成判断0XA5,竟然也不行。</p><br><p> 如下图所示,不能进入断点。 </p><p><img src="https://image.xiaopingtou.net/data/attach/191222/5b054sbG.png" alt="230951oehwv6v6bnhrr4rl"><br></p><p><br></p>
24条回答
qiuchen
1楼 · 2019-12-23 08:33.采纳回答
多谢各位坛友回复,问题找到了。
最终原因出在变量定义上,本来RX_Date[]是在main.c中定义的,在其他C文件中用extern声明,使用没问题。
前天改了一下,把所有声明放在一个.h文件中,结果在多个文件中引用这个.h文件会因为变量重复声明报的错。
我就想了个投机取巧的办法,在main.c文件中用extern声明了一下。链接和编译都没问题,时机并不能调用RX_Data[],导致了程序出错。
现在老老实实改回在main.c中声明了,虽然不够整洁,贵在能用。
qiuchen
2楼-- · 2019-12-23 15:45
redroof 发表于 2017-9-19 21:03
你说的不够清楚。
正规方法是任何全局变量只能在一个c文件里定义,这个c对应的h文件里写extern声明。别处 ...

我是在一个取名时user.h的文件中定义的,定义时没有加extern。有个.C文件中调用变量比较多,我就直接在这个文件中include,在main.c中用extern声明。
不知道在user.h中直接用extern声明是不是可以,这样的话实际就没有正常声明了。
suny1022
3楼-- · 2019-12-23 16:01
 精彩回答 2  元偷偷看……
czlss
4楼-- · 2019-12-23 21:36
看到5A,A5就想到迪文屏
Excellence
5楼-- · 2019-12-24 02:54
c中定义,h中声明,基本规则。。。。
redroof
6楼-- · 2019-12-24 07:17
本帖最后由 redroof 于 2017-9-20 09:37 编辑
qiuchen 发表于 2017-9-19 21:12
我是在一个取名时user.h的文件中定义的,定义时没有加extern。有个.C文件中调用变量比较多,我就直接在这 ...


h里面不加extern,虽然语法上没问题,但实际应用中就是错的!
C语言的这种形式规则太自由了,你在h里面写任何东西都没人管你,你把C文件后缀改成h也没人管你
就像你拿菜刀可以割自己的手一样,没人管你。
为了防止自己拿菜刀割了自己的手,你自己要给自己制定操作规则:切菜应当如何切,才能保证不被自己的到割到自己的手。

这里面同理,操作规则就是h文件里面只准写变量的extern声明,不准写不带extern的变量定义。
遵守这个规则就保证你不会把同一个东西定义两遍。

另:在h文件里面写函数声明并不需要加extern,因为函数的声明已经隐含是extern的。只要注意非inline的函数体不能写在h文件里面就行。

qiuchen
7楼-- · 2019-12-24 09:07
suny1022 发表于 2017-9-19 21:45
在对应的.h文件声明肯定是没有问题的

我是把一个头文件在两个.C中include了,造成冲突。
在main.c中用extern引用,然后出的问题。

一周热门 更多>