gcc:预处理语句#if、#elif、#else、#endif等

来源:互联网 发布:成都金沙房价 知乎 编辑:程序博客网 时间:2024/06/03 22:58

【本文摘自】:       
       作者:清林,博客名:飞空静渡;

#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手册。

原创粉丝点击