您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 第6章编译预处理指令
计算机与软件学院2012年9月第九讲编译预处理指令2第九讲编译预处理指令编译预处理指令概述宏定义无参有参文件包含条件编译C语言程序设计3编译预处理指令概述什么是预处理程序?在用C编译程序对C源代码进行编译之前,即在语法分析、代码生成和优化之前,由C预处理程序对源代码进行第一次处理。处理时,它忽略注释语句,加入.h头文件,并按定义进行替换。预处理的输出,即是编译程序的输入。编译预处理源文件pro.c预处理程序头文件stdio.h编译程序目标文件pro.obj连接程序可执行程序pro.exe目标文件misc.obj库slibce.lib4编译预处理指令概述预处理指令C语言常用的预处理指令包括:宏定义不带参数的宏定义带参数的宏定义文件包含条件编译编译预处理5宏定义不带参数的宏定义格式:#define宏名宏体举例:说明:宏定义一般写在程序的开头。宏名一般习惯用大写字母表示,以便与变量名区别,但这并非规定,也可用小写字母。#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。可以用#undef命令终止宏定义的作用域。编译预处理#definePI3.14标识符常数字符串一段代码6宏定义删除宏定义宏定义删除的一般形式为:#undef宏名举例:编译预处理#definePI3.14159voidfun();//函数声明voidmian(){…}#undefPI//终止PI的作用域,即PI只在main中有效voidfun()//在函数fun中,不能使用宏PI{…}7宏定义无参数的宏定义说明:使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。宏代换只是指定字符串替换宏名的简单替换,不做任何语法检查。如有错误,只能在编译已被宏展开后的源程序时发现。宏定义是专门用于预处理命令的一个专用名词,只作字符替换,不分配内存空间。当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个字符后紧接着加一个反斜杠“\”。对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。编译预处理8宏定义有参数的宏定义格式:#define宏名(参数1,参数2,…,参数n)宏体举例:编译预处理注意!宏名与带参数的括号之间不能加空格。#defineS(a,b)a*barea=S(3,4);•••area=3*4;area=a*b;9宏定义举例使用带参数的宏定义来求三个数的最大值。编译预处理#includestdio.h#defineMAX(a,b,c)((ab?a:b)c?(ab?a:b):c)voidmain(){intx,y,z;printf(请输入三个整数:);scanf(%d%d%d,&x,&y,&z);printf(最大的数为:%d\n,MAX(x,y,z));}10宏定义带参数的宏定义带参数的宏与带参数函数区别功能类似,但有本质区别。宏替换是在编译之前,不进行参数的传递,只是简单的替换;函数调用是发生在程序实际执行时,要进行参数的传递。使用宏定义不需要调用和返回时的开销,但每调用一次,目标程序会增长一次;使用带参数的函数,无论调用多少次,不会使目标程序增长,但每次调用都要占用系统时间和内存进行调用现场的保护和恢复。编译预处理11文件包含#include把所包含的文件的内容放到指令所在的地方。两种形式:#include文件名–只在指定存放头文件的目录下(IDE的include子目录下)查找该文件。#include“文件名”–首先在使用文件包含命令的源文件所在目录下查找该文件;–若未找到,再到指定存放头文件的目录下去查找。编译预处理Bstdio.hfile.c#includestdio.hfile.cABA12文件包含#include好处:当许多程序中需要用到一些共同的常量、数据等资料时,可以把这些共同的东西写在以.h作为扩展名的头文件中;如果哪个程序需要用时,就可用文件包含命令把它们包含进来,省去了重复定义的麻烦。使用说明:文件包含命令通常包含的文件是头文件,即后缀是.h的文件,也可以包含其他的源文件,例如,可包含.c文件。使用文件包含命令可使多个源文件合并成一个源程序后进行编译和运行。编译预处理13文件包含#include常用的标准函数头文件编译预处理头文件类型头文件类型stdio.h输入/输出函数alloc.h动态地址分配函数stdlib.h数字与字符的转换函数conio.h屏幕操作函数string.h字符串函数time.h系统时间函数mem.h内存操作函数math.h数学函数14条件编译条件编译按条件对C程序的一部分进行编译,其它部分不编译。条件编译的目的使源代码能更迅速、更容易地进行修改,并使目标代码缩短。这样,当程序在不同系统上编译、在同一系统不同编译器上编译或进行不同目的的编译时,减少对程序语句的修改。编译预处理15条件编译条件编译指令常用的三种形式编译预处理#if语句#if的一般形式是:#if表达式程序段1#else程序段2#endif举例:#includestdio.h#includeMIN50voidmain(){#ifMIN50printf(MINisgreaterthan50!\n);#elseprintf(MINissmall!\n);#endif}16条件编译条件编译指令常用的三种形式编译预处理#ifdef语句#ifdef的一般形式是:#ifdef标识符程序段1#else程序段2#endif举例:#includestdio.h#defineIBM_PCvoidmain(){#ifdefIBM_PC#defineINTEGER_SIZE16;#else#defineINTEGER_SIZE32;#endif}17条件编译条件编译指令常用的三种形式编译预处理#ifndef语句#ifndef的形式为:#ifndef标识符程序段1#else程序段2#endif举例:#includestdio.h#defineIBM_PCvoidmain(){#ifndefIBM_PC#defineINTEGER_SIZE32;#else#defineINTEGER_SIZE16;#endif}18小结编译预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。预处理命令若有变动,必须对源程序重新编译和连接。使用预处理功能便于程序修改、阅读、移植和调试,便于实现模块化程序设计。编译预处理
本文标题:第6章编译预处理指令
链接地址:https://www.777doc.com/doc-3783749 .html