C语言预编译 教程.doc
文本预览下载声明
第12章 预编译处理
在本书前面的内容中,细心读者应该发现在很多代码中使用过以“#”号开头的预处理命令。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们被称为预处理部分。C语言提供了多种预处理功能,例如宏定义、文件包含、条件编译等。合理地使用预处理有很多好处,例如可以使编写的程序更加便于阅读,便于修改、移植和调试,也有利于模块化程序设计。通过本章能学到如下知识:
预编译概述
宏定义
文件包含
条件编译
职场点拨——从沟通谈职业素养
2007年X月X日,多云
项目经理让我尽快做好规划,为下月项目的启动做好准备。我想:项目下月才启动,这就让我做规划,这么早有什么用呢…….
一问一答
小菜:“下月的项目,项目经理让我现在就做准备,是不是太重视了啊!”
Wisdom:“都说不能打无把握之仗,这在项目开发中也同样适用。做任何项目一定要提前做充分的准备,才能在执行过程中从容地应对各种突发情况。”
小菜:“恩,记住了。言归正传,本章将要讲的预处理有什么用?”
Wisdom:“你做项目之前需要好好规划,同样C语言为了加快处理效率,也提供了一种准备活动,预先实现一些功能。”
12.1 预编译概述
所谓的预处理,是指在进行编译的词法扫描和语法分析之前所做的工作。预处理是C语言的一个重要功能,它是由专用的预处理程序来完成的。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
软件的可移植和可重用问题是软件工程中的一个非常重要的问题。例如需要将在PC机平台上开发的程序移植到大型机上运行,同一套代码不加修改或经过少量的修改即可适应多种计算机系统。C语言是软件工程中广泛使用的一门程序设计语言,需要很好的解决此类问题。为此ANSI C引入了预编译处理命令这一概念,用于规范和统一不同编译器的指令集合。通过这些指令,控制编译器对不同的代码段进行编译处理,从而生成针对不同条件的计算机程序。
ANSI C中主要定义如下三类预编译指令:
#define与#undef指令
#include指令
#if #endif 和#if #else #endif指令
12.2 宏定义
在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中的“宏”有两种,分别是有参数宏和无参数宏。
12.2.1 不带参数的宏定义
顾名思义,在无数参宏的宏名后面没有任何参数,其定义格式如下:
#define 标识符 字符串
上述格式的具体说明如下:
(1)#:表示这是一条预处理命令。在C语言中,凡是以“#”开头的均为预处理命令;
(2)define:为宏定义命令;
(3)标识符:为所定义的宏名;
(4)字符串:可以是常数、表达式、格式串等。
在本书前面的内容中,讲解的定义符号常量就是一种无参宏定义。在开发过程中,通常将反复使用的表达式进行宏定义处理。例如下面的代码:
#define M (y*y+3*y)
上述代码的功能是,设置标识符M来代替表达式(y*y+3*y)。这样在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。看下面的代码:
#define PI 3.1415926
main () {
float l,s,r,v;
printf(input radius:);
scanf(%f,r); /* 输入圆的半径 */
l = 2.0*PI*r; /* 圆周长 */
s = PI*r*r; /* 圆面积 */
v = 4.0/3.0*PI*r*r*r; /* 球体积 */
printf(l=%10.4f\ns=%10.4f\nv=%10.4f\n,l,s,v);
}
在上述代码中,用标识符(称为“宏名”)PI代替字符串“3.1415926”。另外,也可以使用“#undef”来终止宏定义命令。关于宏定义的具体说明如下:
(1)宏名大多数用大写字母表示(变量名一般用小写字母)。
(2)使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用π值,用宏名既便
12.5 疑难问题解析
在本章的内容中,详细介绍了C语言中预编译处理的各种基本知识。本节中,将对本章中比较难以理解的问题进行讲解。
读者疑问:写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。请列举一些成熟软件中常用得宏定义
显示全部