C语言的预处理命令有哪些? 下载本文

内容发布更新时间 : 2024/5/18 21:16:16星期一 下面是文章的全部内容请认真阅读。

问:关于C语言中的预处理命令? 答:

我们可以在C源程序中插入传给编译程序的各种指令,这些指令被称为预处理器指令(等价于汇编语言中的伪指令),它们扩充了程序设计的环境。

现把常用的预处理命令总结如下: 1. 预处理程序

按照ANSI标准的定义,预处理程序应该处理以下12条指令:

#if、#ifdef、#ifndef、#else、#elif、#endif、#define、#undef、#line、#error、#pragma、#include。

显然,所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。 2. #define

#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之(原样替换,不要附加任何人为理解上的符号)。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:

#define macro-name char-sequence

这种语句不用分号结尾。宏名字和串之间可以有多个空格符,但串开始后只能以新行终止。 在C语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是C语句,所以宏定义的语句结尾不需要加分号。

宏也在C里也叫预处理命令,因为宏是在程序编译前先进行字符替换的,所以叫预处理.

例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:

#define LEFT 1 #define RIGHT 0

每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。 定义一个宏名字之后,可以在其他宏定义中使用,例如:

#define ONE 1

#define TWO ONE+ONE #define THREE ONE+TWO

宏代换就是用相关的串替代标识符。因此,如果希望定义一条标准错误信息时,可以如下定义:

#define ERROR_MS “Standard error on input \\n” 如果一个串长于一行,可在行尾用反斜线”\\”续行,如下:

#define LONG_STRING “This is a very very long \\

string that is used as an example”

3. #error

#error指令强制编译程序停止编译,它主要用于程序调试(放在错误的分支中,一旦进入错误的分支就显示该信息)。

#error指令的一般形式是:

#error error-message

注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。

4. #include

程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”)或一对尖括号(<>)包围,例如:

#include “stdio.h” #include

都使C编译程序读入并编译头文件以用于I/O系统库函数。

包含文件中可以包含其他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。 文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双引号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。

通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。

5. 条件编译指令

若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。 5.1 #if、#else、#elif #endif

条件编译指令中最常用的或许是#if,#else,#elif和#endif。这些指令允许程序员根据常数表达式的结果有条件地启用(包围)部分代码。

#if的一般形式是:

#if constant-expression

Statement sequence #endif

如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。

#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:

#include #define MAX 100 Int main(void) { #if MAX>99

printf(“Compiled for array greater than 99.\\n”); #else

printf(“Complied for small array.\\n”); #endif return 0; }

注意,#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。 #elif指令的意思是“否则,如果”,为多重编译选择建立一条if-else-if(如果-否则-如果链)。如果#if表达式为真,该代码块被编译,不测试其他#elif表达式。否则,序列中的下一块被测试,如果成功则编译之。一般形式如下:

#if expression 1

Statement sequence 1 #elif expression 2

Statement sequence 2 #elif expression 3

Statement sequence 3 …

#elif expression n

Statement sequence n #endif

5.2 #ifdef 和 #ifndef

条件编译的另一个方法是使用编译指令#ifdef和#ifndef,分别表示“如果已定义”和“如果未定义”。#ifdef的一般形式如下:

#ifdef macro-name

Statement sequence #endif

如果macro-name原先已经被一个#define语句定义,则编译其中的代码块。 #ifndef的一般形式是:

#ifndef macro-name

Statement sequence #endif

如果macro-name当前未被#define语句定义,则编译其中的代码块。

我认为,用这种方法可以很方便的开启/关闭整个程序的某项特定功能。 ?? #ifdef和#ifndef都可以使用#else或#elif语句。

#inlucde #define T 10 Int main(void) { #ifdef t

Printf(“Hi T\\n”); #else

Printf(“Hi anyone\\n”); #endif #ifndef M