香山书院分享 http://blog.sciencenet.cn/u/wjwqbit we're back, we're back in San Francisco

博文

3. If else编程习惯

已有 3871 次阅读 2010-7-29 23:02 |个人分类:嵌入式C语言编程常见错误(连载)|系统分类:科研笔记|关键词:学者| C语言, 常见错误, 嵌入式, 硬件编程

 

   

    如果你用过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;



https://m.sciencenet.cn/blog-331690-348363.html

上一篇:2.数据运算出错
下一篇:初识VBA

0

发表评论 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-6 23:13

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部