||||
如果你用过Keil C编译器,你可能会碰到这样的错误,如下:
#define LED1_ON() { PORTB |=0x01;} #define LED2_ON() { PORTB |=0x02;} int value; value= 1 ; if( value>0 ) LED1_ON(); else LED2_ON(); |
单独看if else语句,似乎没有任何问题。但却无法通过编译,编译提示: error C141: syntax error near 'else'。分析一下,LED1_ON()为宏定义,表示遇到LED1_ON()的地方就用{ PORTB |=0x01;}替换。于是
int value; value= 1 ; if( value>0 ) { PORTB |=0x01;} ; Else { PORTB |=0x02;} ; |
注意到了吧,用红色标注的分号“;”是多余的,上述代码相当于
int value; value= 1 ; if( value>0 ) { PORTB |=0x01;} ; Else { PORTB |=0x02;} ; |
去掉红色“;”代码编译通过。
分析原因,宏定义LED1_ON()加了括号本意是让它看起来像函数,然后在C语言中函数后面一般都要加分号“;”所以在代码中调用时自然写成LED1_ON();的形式。没想到随意加的分号“;”却成了罪魁祸首。为了防止这种错误出现,建议写if else语句时不管是当行还是多行都要用加大括号{},这样多余的“;”也不会使程序出错,只是多执行了一行无关的语句“;”。
#define LED1_ON() { PORTB |=0x01;} #define LED2_ON() { PORTB |=0x02;} int value; value= 1 ; if( value>0 ) { LED1_ON(); } else { LED2_ON(); } |
当然对于单行代码的宏定义还有另外一些编程习惯,比如下面一种也是可取的。这样的好处是读者一看就知道LED1_ON是宏定义而不是函数的调用。
#define LED1_ON PORTB |=0x01 #define LED2_ON PORTB |=0x02 int value; value= 1 ; if( value>0 ) LED1_ON; else LED2_ON; |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-6 23:13
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社