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