gcc:预处理语句--#if, #elif, #else, #endif和#ifdef,#ifndef

       原创文章,转载请注明出处,谢谢!       
       作者:清林,博客名:飞空静渡

 

#if语句

 

#if语句会计算它后面的表达式,并检查表达式的结果,如果结果为真(true),就编译后面的语句,如果为假(false),就不编译后面的语句。

例如:

      #if COUNT
      char *desc = "The count is non-zero";
      #endif


只有COUNT不为0的情况下才会编译

char *desc = "The count is non-zero";

语句。

 

下面是#if后面的表达式的一些语法规则:

1)表达式可以包括整形常量和宏,这个宏必须是被赋值过(区别被定义过)

2)可以使用圆括号来指定表达式的顺序。

3)表达式中可以包含C语言中的+,-,*,/,<<和>>算术运行符。这些算术运算使用当前平台的整型的最大表示的值来运算,一般为64位的整型值。

4)表达式也可以包括<,>,<=,>=和==比较运行符。

5)表达式可以包括&&和||逻辑运算符。

6)非(!)运算符可以反转表达式的结果,如:#if !(LIMXP > 12)

      如果LIMXP > 12,那么表达式的结果就为假

7)#if也可以和defined语句一起使用,这样可以检查某一个宏是否被定义过(也可以直接使用#ifdef)。如:

     #if defined(MINXP)

     意思是如果MINXP被定义过,那么表达式就为真。也可以在前面加一个非(!)运算符来取反的结果,如:

     #if !defined(MINXP)

     意思是如果MINXP没有被定义过,那么表达式就为真。

8)一个标识符如果没有被定义过,那它的值总是为0,-Wundef选项可以用来产生这个警告信息。

9)有参数的宏(gcc:预处理语句--#define、#error和#warning )在表达式中也是零值,-Wundef选项可以用来产生这个警告信息。

10)#else提供另外的选择,如:

#if MINTXT <= 5
#define MINTLOG 11
#else
#define MINTLOG 14
#endif
11)#elif可以提供一个或多个的选择表达式,如:

#if MINTXT <= 5
#define MINTLOG 11
#elif MINTXT == 6
#define MINTLOG 12
#elif MINTXT == 7
#define MINTLOG 13
#else
#define MINTLOG 14
#endif

 

#ifdef

在跟#ifdef后面同一行的宏如果被定义过的话,那么#ifdef后面的语句块将会被编译,这个语句块以#endif结束。例如:

#ifdef MINTARRAY
int xarray[20];
#endif /* MINTARRAY */

 

#endif后面的注释语句并不是必须的/* MINTARRAY */,但确实一个好的管用法,这样就可以知道是你定义的哪个宏的结束位置。

和#ifdef意思想反的就是#ifndef了。

 

更多请参考GCC手册。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值