分类: C/C++
2006-09-13 16:13:52
编译预处理是指在编译程序对C源程序进行编译之前,先对程序正文进行预处理,分为宏定义#define、#undef;文件包含#include及条件编译#if、#else、#ifdef、#ifndef、#elif和#endif等。
10.1宏定义
宏定义是:通过#define指令来将一个标识符与一个字符串关联起来,即用标识符来代替该字符串,这个字符串称为宏名。
宏定义指令:#define,终止宏定义指令#undef
分为:带参数宏定义和不带参数宏定义
10.1.1 不带参数的宏
宏定义格式:#define 标识符 替换字符串
说明:
1、宏定义一般放在程序开头,用来定义符号常量;习惯上将“标识符”大写,称为宏名;宏定义是指令,不是语句,所以后面不能有分号。
2、编译预处理将程序中“标识符”替换成后面“替换字符串”。
宏定义的直接应用之一是在表示数组大小时,能使其大小易于修改。
[课件展示命令格式及相关例子]
例:#define TRUE 1 /*预编译将程序中TRUE 换成1*/
#define FALSE 0 /*预编译将程序中FALSE 换成0*/
#define MAXSIZE 80 /*修改80,可改变数组大小*/
…..
char buffer[MAXSIZE];
删除宏格式:#undef 宏名
例:#define MAXSIZE 80
…..
#undef MAXSIZE /* MAXSIZE以后不再有效 */
10.1.2带参数的宏
1、带参数的宏定义格式:#define 宏名(形式参数列表) 替换字符串
说明:形参列表用逗号分隔。
2、带参数的宏调用格式:宏名(实际参数列表)
说明:预编译将实参代替形参,再替换(与简单函数类似)。
例10-1
1、宏定义是预编译时处理,而函数调用是程序运行时进行。
2、宏定义实参代替形参是简单的字符串替换,函数调用是将实参值或地址传递给形参
3、实参若为表达式,函数调用只求值一次,宏定义替换时求值可能不止一次
通过例10-2、例10-3说明区别3 [课件展示区别3]
4、函数只有一个返回值,而宏可有多个返回值
例10-4[课件展示说明区别4]
带参数的宏删除格式:#undef 宏名
例:#define ABS(x) ((x)<0?-(x):(x))
….
#undef ABS
10.2文件包含
作用:将指定的文件内容包含到当前文件中,在程序开头使用指令#include
格式一:#include <文件名>
说明:包含系统目录(如:INCLUDE)中指定的文件(一般用于包含系统提供的头文件)。
格式二:#include “文件名”
说明:包含当前目录或系统目录中指定的文件(先在当前目录中找,一般用于包含自定义的头文件)。
注意两种格式的区别。
例:#include
#include “mydef.h”
注意:#include一般用来包含“.h”为后缀的头文件,预编译将此文件插入到当前位置。多个文件包含需用多个#include指令。
例:#include
#include
#include “mydef.h”
…..
文件包含指令可以嵌套使用(一个被包含文件中,可以包含另一个被包含文件)。
例:p143[课件展示]
10.3条件编译
条件编译概念:按照不同的条件去编译程序不同的部分,从而生成不同的目标代码,以实现程序的不同功能。
条件编译的用途:可构造多种条件下运行的程序,提高程序的通用性和可移移植性, 便用程序的调式与纠错,大型C程序,经常使用条件编译。
与条件编译相关预处理指令有:#if、#else、#ifdef、#ifndef、#elif和#endif
条件编译指令使用形式:
1、#if的使用方法[课件展示命令的两种形式]
形式(1):#if 常量表达式
程序段1
#else /*此部分可以没有*/
程序段2
#endif
功能:常量表达式为真,编译程序段1,否则编译程序段2
例10-5[课件展示]
形式(2):#if 常量表达式1
程序段1
#elif常量表达式 2 /*可有多个#elif */
程序段2
#else
程序段3
#endif
功能:常量表达式1为真,编译程序段1;若常量表达式1为假,而常量表达式2为真,编译程序段2;其它,编译程序段3
2、#ifdef的使用方法
格式:#ifdef 标识符
程序段1
#else /*此部分可以没有*/
程序段2
#endif
功能:若标识符已被定义(通常用#define),则编译程序段1,否则编译程序段2
例10-6[课件展示]
3、#ifndef的使用方法
格式:#ifndef 标识符
程序段1
#else /*此部分可以没有*/
程序段2
#endif
功能:若标识符未被定义(通常用#define),则编译程序段1,否则编译程序段2
例10-7[课件展示]
例p148[课件展示]
小结:
本节讲了三种预编译处理:
宏定义是用标识符来代替该字符串,这个字符串称为宏名;
文件包含是将指定的文件内容包含到当前文件中;
条件编译是按照不同的条件去编译程序不同的部分,从而生成不同的目标代码,以实现程序的不同功能;
要掌握它们在程序中作用,正确的使用它们来增加程序的可读性、灵活性和通用性,减少出错机率。