本章的主要内容:三种预处理命令
宏定义
文件包含
条件编译第五章 预处理命令回首页
5.1.1简单宏定义 ( 不带参数的宏定义 )
命令形式:
#define 宏名字 替代正文对宏定义的处理:将宏名字替换 ( 也叫宏展开 ) 为替代正文,不作任何语法检查 。
书写习惯:用大写字母表示宏名字,以区别于普通变量名 。
讨论使用宏定义的好处 。
宏定义的作用范围,C程序中,宏定义位置一般写在程序开头,从宏定义开始处有效 。 如果要在源程序的某处提前终止宏定义的作用域,可以使用 #undef,形式如下:
#undef 宏名字表示从该行开始,不再存在这个宏定义 。
宏定义的替代正文可以是任意的字符组合,预处理程序对它的处理只是简单的展开和替换,结果是否正确,由编译程序来检查 。
5.1 宏定义
5.1.2 带参数的宏定义命令形式:
#define 宏名字 (参数表 ) 替代正文宏名字后紧跟括号,括号内是逗号分隔的几个标识符,被看作参数名字,
替代正文中应出现参数表中的参数 。
程序中使用带参数的宏类似于函数调用,称为,宏调用,,形式为:
宏名字 ( 实参表 )
除了给出宏名字,还要给出各个宏参数的替代段,替代段之间也用逗号分隔 。
讨论使用宏调用和函数调用的特点 。
预处理程序对带参宏定义的处理分两步:
( 1) 用宏调用的实际参数替代出现在替代正文中的对应宏参数 。
( 2) 代换结果用到程序中出现宏调用的地方 。
讨论在定义和使用宏调用时还应该注意的问题 。
5.1 宏定义用 #include开始的预处理命令叫文件包含命令 。 由于该命令写在所有的源文件的开头,又叫头文件,常用,,h”做后缀,( 没有后缀或用,c”做后缀也可以 ) 。
包含命令的形式如下:
#include <文件名 >
或,#include,文件名,
文件名放在 <>中,表示到指定目录中寻找文件,常用于包含系统提供的头文件 。 文件名放在,,中,则先到当前工作目录中找文件,再到指定目录中找,常用于包含自己提供的头文件 。
预处理程序对包含命令的处理过程:按规定方法寻找文件,若找到,用文件内容替换包含命令所在的行 。 找不到,预编译出错,
提示无法打开相应文件 。
包含文件可以嵌套,预处理程序会将其全部展开,直到不包含一个预处理命令为止 。 替换的文件是文本文件即可,但替换后要满足 C程序语法规定 。
讨论使用包含命令应注意的问题 。
5.2 文件包含条件编译:控制程序中的某些行只在满足一定条件下才进行编译,
或控制满足某一条件时对一组语句进行编译,不满足这一条件时编译另一组语句,的预处理命令 。
它的作用是划出源程序的一些片段,使预处理程序可以根据一定条件确定保留或丢掉某个片段,或确定从几个片段中选取哪一个片段保留下来 。
讨论条件编译的处理过程及使用注意问题 。
形式 1,#ifdef 标识符程序段 1
#else
程序段 2
#endif
根据标识符是否由用 #define命令定义过,选择保留程序段 1或程序段 2。
5.3 条件编译形式 2,#if 表达式程序段 1
#else
程序段 2
#endif
根据表达式值是否为真,选择保留程序段 1还是程序段 2。
形式 3,#if 表达式 1
程序段 1
#elif 表达式 2
程序段 2
#elif 表达式 3
···
#else
程序段 n
#endif
根据多个表达式值,从若干程序段中选取一段 。
5.3 条件编译第五章 预处理命令本章内容不多,但很实用,出现的预处理命令有,define,include,
if,elif,else,endif,ifdef,idndef。
本章主要知识点:
宏定义的作用,代参宏定义的定义方法,宏调用和函数调用的区别,
宏展开的方法 。
包含命令在多文件程序中的使用,常用头文件及相关函数的使用 。
条件编译的几种实现方法,如何使用控制条件编译的宏定义 。
回本章首页