条件编译命令
有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。
#if、#else,#elif,#endif
#if的一般含义是如果#if后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。
#ifconstant-expression
statement sequence
#endif
例如:
#define MAX 100
main()
{
#if MAX > 99
printf("Compiled for array greater than 99\n")
#endif
}
由于MAX大于99,以上程序在屏幕上显示一串消息。该例说明了一个重点:跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof。
#else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。因而上面的例子可扩充。
例如:
#define MAX 10
main()
{
#if MAX > 99
printf("Compiled for array greater than 99.\n")
#else
printf("Compiled small array.\n")
#endif
}
在此例中,因为MAX小于99,所以,不编译#if块,而是编译#else块,因此,屏幕上显
示"compiled for small array"这一消息。
注意,#else既是#if块又是#else块头。这是因为任何#if仅有一个#endif。
#elif命令意义与ELSE IF相同,它形成一个if-else-if阶梯状语句,可进行多种编译选择。
#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。
#if expression
statement sequence
#elif expression1
statement sequence
#elif expression2
statement sequence
#elif expression3
statement sequence
#elif expression4
#elif expression3N
statement sequence
#endif
例如:下面程序利用ACTI Ve_ COUNTRY定义货币符号。
#define US 0
#define ENGLAND1
#define FRANCE 2
# define ACTIVE_COUNTRY US
#if ACTIVE_COUNTRY = = US
char currency[ ]="dollar; "
#elif ACTIVE_COUNTRY= =ENGLAND
char currency[ ]="pound; "
#else
char currency[ ]="franc;"
#endif
#if与#elif命令可能一直嵌套到实现规定的权限,其中#endif、#else或#elif与最近#if或#elif关联。例如,下面程序是完全有效的。
#if MAX>100
#if SERIAL_VERSION
int port=198;
#elif
int port=200;
#elif
#else
char out_buffer[100];
#endif
#ifdef,#ifndef
条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。
#ifdef的一般形式是:
#ifdef macroname
statement sequence
#endif
如果宏名在前面#define语句中已定义过,则该语句后的代码块被编译。
#ifndef的一般形式是:
#ifndef macroname
statement sequence
#endif
如果宏名在#define 语句中无定义,则编译该代码块。
#ifdef 与#ifndef可以用于#else 语句中,但#elif 不行,例如:
#define TED 10
main()
{
#ifdef TED
printf("Hi,TED.\n");
#else
printf("Hi everyone.\n);
#endif
#ifndef RALPH
printf("RALPH not defined.\n");
#endif
}
上述代码打印“ Hi Ted. ”及“ RALPH not defined.”。如果TED没有定义,则显示“ Hi,everyone.”,后面是“RALPH not defined”。
可以像嵌套#if 那样将#ifdef 与#ifndef 嵌套至任意深度。
#undef
命令#undef 取消其后那个前面已定义过有宏名定义。一般形式为:
#undef macroname
例如:
# define LEN 100
#difine WIDTH 100
char array[LEN][WIDTH];
# undef LEN
# undef WIDTH
/ *at this point both LEN and WIDTH are undefined * /
直到遇到#undef 语句之前, LEN与WIDTH均有定义。
# undef 的主要目的是将宏名局限在仅需要它们的代码段中。
#line
命令#line改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。
命令的基本形式如下:
# line number["filename"]
其中的数字为任何正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件的名字。命令#line主要用于调试及其它特殊应用。
例如,下面说明行计数从100开始;printf()语句显示数102,因为它是语句#line 100后的第3行。
#line 100 /*初始化行计数器*/
main () /*行号100*/
{ /*行号101*/
printf( "%d\n",_line_) ; /*行号102*/
}
#pragma
命令#pragma 为实现时定义的命令,它允许向编译程序传送各种指令。例如,编译程序可能有一种选择,它支持对程序执行的跟踪。可用#pragma语句指定一个跟踪选择。
|