分类:
2012-04-19 09:33:00
【本文摘自】:
作者:清林,博客名:飞空静渡;
#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手册。