文档详情

第10章 预处理命令.doc

发布:2025-03-05约7.89千字共12页下载文档
文本预览下载声明

第10章〓预处理命令

10.1〓知识要点回顾

10.1.1〓C语言的预处理

在C语言中,并没有任何内在的机制来完成以下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。

尽管在目前绝大多数C语言的编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程先于编译器对源代码进行处理。预处理过程扫描源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换,产生新的源代码提供给编译器。预处理过程还会删除程序中的注释和多余的空白字符。

C语言的预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

C语言中常用的预处理指令如表10-1所示。

表10-1〓C语言常用预处理命令

指令

用途

#

空指令,无任何效果

#include

包含一个源代码文件

#define

定义宏

#undef

取消已定义的宏

#ifdef

如果宏已经定义,则编译下面代码

#ifndef

如果宏没有定义,则编译下面代码

#if

如果给定条件为真,则编译下面代码

#else

用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码

#endif

结束一个#if…#else条件编译块

10.1.2〓文件包含

#include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。

在程序中包含头文件有两种格式:

#includemy.h

#includemy.h

第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起来。这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。

采用两种不同包含格式的理由是:编译器安装在公共子目录下,而被编译的应用程序在它们自己的私有子目录。一个应用程序既会包含编译器提供的公共头文件,也会包含自定义的私有头文件。采用两种不同的包含格式,可以使编译器能够在多个头文件中区别出一组公共的头文件。

预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如:

#defineMYC

#includemy.c

#undefMYC

#includemy.c

以上代码中my.c被两次包含,但在my.c中可以根据MYC是否定义(define)而决定两次包含时编译的代码不同。

为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如,在my.h文件中使用如下预处理命令结构:

#ifndefMY_H

#defineMY_H

〓……//被编译语句

#endif

当在其他文件中多次使用#includemy.h时,my.h文件中的被编译语句部分将只被编译一次。

10.1.3〓宏定义

宏是一个被定义了用来代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全局符号。宏的第二种用法是定义带参数的宏,这样的宏可以像函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。

1.#define指令

#define预处理指令是用来定义宏的。该指令最简单的格式是:首先申明一个标识符,然后给出这个标识符代表的代码。在后面的源代码中,就用这些代码来替代该标识符。作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序中的宏标识符和一般变量标识符区别开来。例如:

#defineMAX_NUM10

intarray[MAX_NUM];

for(i=0;iMAX_NUM;i++)/*……*/

在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数组所能容纳的最大元素数目。程序中可以多次使用这个值。如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。

宏表示的值可以是一个常量表达式,其中允许包括前面已经定义的宏标识符。例如:

#defineX1

#defineY2

#defineZ(X+Y)

上面的宏定义使用了括号,尽管它们并不是必须的,但出于谨慎考虑,还是应该加上括号。例如:

s=Z*Y;

预处理过程把上面的一行代码转换成:

s

显示全部
相似文档