《《编译预处理》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《编译预处理》PPT课件.ppt(12页珍藏版)》请在三一办公上搜索。
1、第九章 编译预处理,概述,编译预处理是指在进行编译之前,系统自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译,过程如下图:,语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能有利于程序的便于阅读、修改、移植和调试,也有利于模块化程序设计。预处理的命令有以下几个特点:1预处理命令均以#开头,结尾不加分号;2预处理命令可以放在程序中任何位置,作用范围从定义处到文件结尾。,概述,1无参宏定义格式:#define 宏名 字符串 功能:程序中用宏名表示字符串,编译预处理时用字符串替换宏名。说明:(1)define为宏定义命令,宏名一般用大写字母表
2、示,字符串可以是常数、表达式、格式串等。(2)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用如下语句:#undef 宏名,9.1 宏定义,(3)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换;,#define PI 3.14159main()float s,l,r;printf(input r:);scanf(%f,9.1 宏定义,2带参宏定义格式:#define 标示符(形参表)形参表达式例如:#define MAX(a,b)(ab)?(a):(b)进行宏替换时,可以像使用函数一样,通过实参与形参传递数据。,#define FUN(a)a*ama
3、in()int i,s=0;for(i=1;i=10;i+)s=s+FUN(i);printf(%dn,s);,9.1 宏定义,说明:(1)宏名和括号之间不能有空格(2)宏替换只作简单的替换,设有如下宏定义:#define S(x)x*x则S(5+6)将被 替换为:5+6*5+6若宏定义为:#define S(x)(x)*(x)S(5+6)就会被替换为:(5+6)*(5+6),9.1 宏定义,实质:就是用指定的文件的内容替换文件包含命令命令的一般形式为:格式1:#include 格式2:#include 文件名 例如:#include#include stdio.h,9.2 文件包含,关于文件
4、包含的几点说明:(1)使用格式1时,预处理程序在C编译系统定义的标准目录下查找指定的文件;(2)使用格式2时,预处理程序首先在当前源文件所在目录下查找指定文件,如没找到,则在C编译系统定义的标准目录下查找指定的文件;(3)一个#include命令只能包含一个文件,而且必须是文本文件;(4)文件包含可以嵌套,如a包含b,b包含c。,9.2 文件包含,条件编译有三种形式,1.第一种形式:#ifdef 标识符 程序段1#else 程序段2#endif【功能】如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。,9.3 条件编译,2.第二种形式:#ifndef 标识符 程序段1#else 程序段2#endif【功能】如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。,9.3 条件编译,3.第三种形式:#if 常量表达式 程序段1#else 程序段2#endif【功能】如常量表达式值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。,#define NUM 2008main()#ifdef NUM printf(%d,1234);#else printf(“%d,6789);#endif,9.3 条件编译,