TAG:
预编译和宏定义,ANSI C,条件编译
TEXT:
为了实现在编译程序的时候,控制哪些代码参与编译,哪些代码不参与编译,C语言中引入了条件编译指令。条件编译的引入,可以将针对于不同硬件平台或软件平台的代码,编写在于同一程序文件中,从而方便程序的维护和移植。在进行软件移植的时候,可以针对不同的情况,控制不同的代码段被编译。
REF:.txt,#ifdef
… #else …#endif.txt,#if defined… #else …#endif.txt,#ifndef … #else …#endif.txt,#if !defined … #else …#endif.txt,#ifdef …#elif … #elif …#else … #endif.txt
|
||||
TAG:
预编译和宏定义,ANSI C,条件编译,#ifdef … #else …#endif
TEXT:
此编译指令类似于C语言中的if else 语句,是一种典型的条件编译指令。其语法形式如下:
#ifdef
常量表达式
代码段1
#else
代码段2
#endif
其中常量表达式可以仅仅为一个编译标志。
如果常量表达式的值为真(非零值),编译代码段1部分的代码,否则编译代码段2部分的代码。
当常量表达式为简单的编译标志时,如果此编译标志在前面的代码中,已经使用#define指令定义过,且在当前的代码段中有效,则编译代码段1部分的代码,否则编译代码段2部分的代码。
例11-7 定义符号常量CONST_TRUE 和TAG_TRUE,根据不同的条件进行不同操作。
#define CONST_TRUE 1
#define TAG_TRUE
void main()
{
#ifdef CONST_TRUE
printf("The CONST_TRUE is true/n");
#else
printf("The CONST_TRUE is false/n");
#endif
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined/n");
#else
printf("The TAG_TRUE is not defined/n");
#endif
}
程序的运行结果如下
The CONST_TRUE is true
The TAG_TRUE is defined
因为CONST_TRUE代表1,所以系统编译printf("The CONST_TRUE is true/n")部分代码,因此程序运行输出“The CONST_TRUE is true”的结果。如果CONST_TRUE代表0,则系统编译printf("The CONST_TRUE is false/n")部分代码。由于TAG_TRUE已经定义,所系统编译printf("The TAG_TRUE is defined/n")部分代码。
此编译指令的简单形式为单分支的条件编译指令,其语法格式如下:
#ifdef
常量表达式
代码段
#endif
如果常量表达式的值为真,则编译“代码段”部分的代码,否则跳过此部分的代码。当常量表达式为编译标志时,如果此编译标志有效,则编译“代码段”部分的代码,否则跳过此部分的代码。
下面程序中,只有定义了TAG_TRUE 之后,才可以编译printf("The TAG_TRUE is defined/n")语句。
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined/n");
#endif
REF:.txt
|
||||
TAG:
预编译和宏定义,ANSI C,条件编译,#if defined… #else …#endif
TEXT:
此编译指令为#ifdef … #else …#endif的等价编译指令。其语法格式如下:
#if defined
常量表达式
代码段1
#else
代码段2
#endif
或
#if defined (
常量表达式)
代码段1
#else
代码段2
#endif
此编译指令的简单形式为单分支的条件编译指令,其语法形式如下:
#if defined
常量表达式
代码段1
#endif
REF:.txt
|
||||
TAG:
预编译和宏定义,ANSI C,条件编译,#ifndef … #else …#endif
TEXT:
语法形式如下:
#ifndef
常量表达式
代码段1
#else
代码段2
#endif
如果常量表达式的值为假(零值)时,编译代码段部分的代码,否则编译代码段2部分的代码。当常量表达式为编译标志时,如果此编译标志无效则编译代码段1部分的代码,否则编译代码段2部分的代码。
此编译指令的简单形式为单分支的选择编译指令,其语法格式如下:
#ifndef
常量表达式
代码段1
…
#endif
REF:.txt
|
||||
TAG:
预编译和宏定义,ANSI C,条件编译,#if !defined … #else …#endif
TEXT:
此编译指令与#ifndef … #else …#endif等价,其语法形式如下:
# if !defined
常量表达式
代码段1
#else
代码段2
#endif
或
# if !defined(
常量表达式)
代码段1
#else
代码段2
#endif
提示 头文件的重复包含,造成变量重复定义或函数的重复声明,此错误是初学者经常遇到的一个问题。主要的原因是在编辑自己的头文件的时候,并没有加入有效的预防措施。解决此类问题,在文件开始与结尾加入类似代码
#if !defined(MY__INCLUDED_) /*
此头文件对应的编译标志*/
#define MY__INCLUDED /*
此头文件没有被包含,所以编译此部分的代码*/
……
#endif // !defined(MY__INCLUDED)
REF:.txt
|
||||
TAG:
预编译和宏定义,ANSI C,条件编译,#ifdef … #else …#endif
TEXT:
此编译指令类似于C语言中的if else 语句,是一种典型的条件编译指令。其语法形式如下:
#ifdef
常量表达式
代码段1
#else
代码段2
#endif
其中常量表达式可以仅仅为一个编译标志。
如果常量表达式的值为真(非零值),编译代码段1部分的代码,否则编译代码段2部分的代码。
当常量表达式为简单的编译标志时,如果此编译标志在前面的代码中,已经使用#define指令定义过,且在当前的代码段中有效,则编译代码段1部分的代码,否则编译代码段2部分的代码。
例11-7 定义符号常量CONST_TRUE 和TAG_TRUE,根据不同的条件进行不同操作。
#define CONST_TRUE 1
#define TAG_TRUE
void main()
{
#ifdef CONST_TRUE
printf("The CONST_TRUE is true/n");
#else
printf("The CONST_TRUE is false/n");
#endif
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined/n");
#else
printf("The TAG_TRUE is not defined/n");
#endif
}
程序的运行结果如下
The CONST_TRUE is true
The TAG_TRUE is defined
因为CONST_TRUE代表1,所以系统编译printf("The CONST_TRUE is true/n")部分代码,因此程序运行输出“The CONST_TRUE is true”的结果。如果CONST_TRUE代表0,则系统编译printf("The CONST_TRUE is false/n")部分代码。由于TAG_TRUE已经定义,所系统编译printf("The TAG_TRUE is defined/n")部分代码。
此编译指令的简单形式为单分支的条件编译指令,其语法格式如下:
#ifdef
常量表达式
代码段
#endif
如果常量表达式的值为真,则编译“代码段”部分的代码,否则跳过此部分的代码。当常量表达式为编译标志时,如果此编译标志有效,则编译“代码段”部分的代码,否则跳过此部分的代码。
下面程序中,只有定义了TAG_TRUE 之后,才可以编译printf("The TAG_TRUE is defined/n")语句。
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined/n");
#endif
REF:.txt
|