欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    (6.17)--补充课件第11讲-编译预处理.ppt

    • 资源ID:96451387       资源大小:954KB        全文页数:57页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    (6.17)--补充课件第11讲-编译预处理.ppt

    第十一讲第十一讲编译预处理编译预处理C语言程序设计语言程序设计 The C Programming Language2C语言程序设计语言程序设计 温州理工学院温州理工学院 2第十讲编译预处理第十讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间3C语言程序设计语言程序设计 温州理工学院温州理工学院 3第十一讲编译预处理第十一讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间4C语言程序设计语言程序设计 温州理工学院温州理工学院 4概述概述C语言与其他高级语言的一个重要区别是可以语言与其他高级语言的一个重要区别是可以使用预处理命令和具有使用预处理命令和具有预处理预处理的功能。的功能。ANSI C标准规定可以在标准规定可以在C源程序中加入一些源程序中加入一些“预处理命令预处理命令”,以改进程序设计环境,提高编,以改进程序设计环境,提高编程效率。程效率。预处理命令是由预处理命令是由ANSI C统一规定的,但是它不统一规定的,但是它不是是C语言本身的组成部分,不能直接对它们进语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译之前,先对程序中这在对程序进行通常的编译之前,先对程序中这些特殊的命令进行些特殊的命令进行“预处理预处理”5C语言程序设计语言程序设计 温州理工学院温州理工学院 5概述概述经过预处理后程序可由编译程序对预处理后的经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的源程序进行通常的编译处理,得到可供执行的目标代码。目标代码。所谓所谓预处理预处理是指在进行编译的第一遍扫描是指在进行编译的第一遍扫描(词法词法扫描和语法分析扫描和语法分析)之前所作的工作。之前所作的工作。预处理是预处理是C语言的一个重要功能,它由预处理语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的理部分作处理,处理完毕自动进入对源程序的编译。编译。6C语言程序设计语言程序设计 温州理工学院温州理工学院 6概述概述(contd)C语言提供了多种预处理功能,如宏定义、文语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。有利于模块化程序设计。7C语言程序设计语言程序设计 温州理工学院温州理工学院 7概述概述(contd)C提供的预处理功能主要有以下三种:提供的预处理功能主要有以下三种:宏定义宏定义文件包含文件包含条件编译条件编译这些功能分别用宏定义命令、文件包含命令、这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与条件编译命令来实现。为了与一般一般C语句语句相区相区别,这些命令以符号别,这些命令以符号“”开头。例如:开头。例如:#define#include8C语言程序设计语言程序设计 温州理工学院温州理工学院 8第十一讲编译预处理第十一讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间9C语言程序设计语言程序设计 温州理工学院温州理工学院 9宏定义宏定义在在C言言源程序中允许用一个标识符来表示一个字符源程序中允许用一个标识符来表示一个字符串,称为串,称为“宏宏”。被定义为被定义为“宏宏”的标识符称为的标识符称为“宏名宏名”。在编译。在编译预处理时,对程序中所有出现的预处理时,对程序中所有出现的“宏名宏名”,都用,都用宏定义中的字符串去代换,这称为宏定义中的字符串去代换,这称为“宏代换宏代换”或或“宏展开宏展开”。宏是由源程序中的宏定义命令宏是由源程序中的宏定义命令#define来定义的。来定义的。宏代换是由预处理程序自动完成的。宏代换是由预处理程序自动完成的。在在C语言中,语言中,“宏宏”分为两种分为两种:无参宏定义无参宏定义带参宏定义带参宏定义10C语言程序设计语言程序设计 温州理工学院温州理工学院 10无参宏定义无参宏定义无参宏定义无参宏定义一般形式:一般形式:#define 标识符标识符 字符串字符串其中的其中的“#”表示这是一条预处理命令。表示这是一条预处理命令。凡是以凡是以“#”开头的均为预处理命令。开头的均为预处理命令。“define”为宏定义命令。为宏定义命令。“标识符标识符”为所定为所定义的宏名。义的宏名。“字符串字符串”可以是常数、表达式、可以是常数、表达式、格式串等。格式串等。符号常量的定义就是一种无参宏定义。此外,符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义。常对程序中反复使用的表达式进行宏定义。例如:例如:#define M(y*y+3*y)11C语言程序设计语言程序设计 温州理工学院温州理工学院 11无参宏定义无参宏定义在在s=3*M+4*M+5*M 中作了宏调用。在预处理时中作了宏调用。在预处理时经宏展开后该语句变为:经宏展开后该语句变为:s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);但要注意的是,在宏定义中表达式但要注意的是,在宏定义中表达式(y*y+3*y)两边两边的括号不能少。否则会发生错误。的括号不能少。否则会发生错误。#define M(y*y+3*y)main()int s,y;printf(“Input a number:);scanf(%d,&y);s=3*M+4*M+5*M;printf(s=%dn,s);12C语言程序设计语言程序设计 温州理工学院温州理工学院 12宏定义宏定义(contd)标识符(宏名)命名,遵守标识符(宏名)命名,遵守C语言标识符的命名规则。为语言标识符的命名规则。为便于与一般变量区别,宏名常采用大写字母。便于与一般变量区别,宏名常采用大写字母。宏定义允许嵌套,在宏定义的字符串中可以使用已经定义宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。的宏名。在宏展开时由预处理程序层层代换。如有定义:如有定义:#define PI 3.1415926#define S PI*r*r /*PI是已定义的宏名是已定义的宏名*/在编译预处理时,语句在编译预处理时,语句printf(“The Area=%lfn”,S);经宏代换后变为:经宏代换后变为:printf(The Area=%lfn,3.1415926*r*r);13C语言程序设计语言程序设计 温州理工学院温州理工学院 13宏定义宏定义(contd)宏定义是用宏名代表字符串,仅作简单置换,不宏定义是用宏名代表字符串,仅作简单置换,不分配内存空间,编译预处理时不检查语法。只有分配内存空间,编译预处理时不检查语法。只有在源程序被宏展开后,进行编译时才作语法检查。在源程序被宏展开后,进行编译时才作语法检查。下列的宏定义都不可取:下列的宏定义都不可取:#define PI =3.1415926535/*多了等号多了等号*/#define PI 3.1415926535;/*多了分号多了分号*/上述宏定义对于同一个语句:上述宏定义对于同一个语句:s=PI*r*r;宏展开后分别为:宏展开后分别为:s=3.1415926535*r*r;s=3.1415926535;*r*r;14C语言程序设计语言程序设计 温州理工学院温州理工学院 14宏定义宏定义(contd)宏替换只对单独的宏名单词进行,对于括在引宏替换只对单独的宏名单词进行,对于括在引号中的字符串不起作用。若有宏定义:号中的字符串不起作用。若有宏定义:#define MAX 500 对于下列语句:对于下列语句:int MAXICOAT=10;/*MAX不是独立单词,不不是独立单词,不替换替换*/printf(“MAX=”,MAX);/*只有后面的要替换只有后面的要替换*/15C语言程序设计语言程序设计 温州理工学院温州理工学院 15#define MAX 500#undef MAX 宏定义宏定义(contd)宏定义必须写在函数之外,宏名的有效范围为宏定义必须写在函数之外,宏名的有效范围为定义命令之后到该源文件结束,也可以使用定义命令之后到该源文件结束,也可以使用#undef 命令来提前终止宏名的作用域。命令来提前终止宏名的作用域。宏名宏名MAX的有效范围的有效范围宏名宏名MAX在此处无效在此处无效16C语言程序设计语言程序设计 温州理工学院温州理工学院 16宏定义使用说明宏定义使用说明宏定义是用宏名来表示一个字符串,在宏展开时宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。错误,只能在编译已被宏展开后的源程序时发现。宏定义不是说明或语句,在行末不必加分号,如宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。加上分号则连分号也一起置换。宏定义必须写在函数之外,其作用域为宏定义命宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用令起到源程序结束。如要终止其作用域可使用#undef 命令。命令。17C语言程序设计语言程序设计 温州理工学院温州理工学院 17宏定义使用说明宏定义使用说明要终止宏的作用域可使用要终止宏的作用域可使用#undef 命令。命令。#define PI 3.14159main()#undef PIf1()#undef 命令终止命令终止了了PI作用域,因此作用域,因此这里这里PI 只在只在main 函函数中有效,在数中有效,在f1()中中则无效。则无效。18C语言程序设计语言程序设计 温州理工学院温州理工学院 18宏定义使用说明宏定义使用说明宏名在源程序中若用引号括起来,则预处理程序不对宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。如下例中定义宏名其作宏代换。如下例中定义宏名OK 表示表示100,但在,但在printf 语句中语句中OK 被引号括起来,因此不作宏代换。被引号括起来,因此不作宏代换。宏定义允许嵌套,在宏定义的字符串中可以使用已经宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。定义的宏名。在宏展开时由预处理程序层层代换。#define PI 3.1415926#define S PI*y*y/*PI 是已定义的宏名是已定义的宏名*/#define OK 100main()printf(OK);19C语言程序设计语言程序设计 温州理工学院温州理工学院 19宏定义使用说明宏定义使用说明对对“输出格式输出格式”作宏定义,可以减少书写麻烦。作宏定义,可以减少书写麻烦。#define P printf#define D%dn#define F%fnmain()int a=5,c=8,e=11;float b=3.8,d=9.7,f=21.08;P(D F,a,b);P(D F,c,d);P(D F,e,f);getch();20C语言程序设计语言程序设计 温州理工学院温州理工学院 20宏定义使用说明宏定义使用说明习惯上宏名用大写字母表示,以便于与变量区别。但习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。也允许用小写字母。可用宏定义表示数据类型,使书写方便。例如:可用宏定义表示数据类型,使书写方便。例如:#define STU struct stu。在程序中可用。在程序中可用STU 作变量说作变量说明:明:STU body5,*p;宏定义表示数据类型和宏定义表示数据类型和typedef定义数据说明符:定义数据说明符:宏定义只是宏定义只是简单的字符串代换简单的字符串代换,是在预处理完成,是在预处理完成的的;而而typedef是在编译时处理的,它是在编译时处理的,它不是作简单的代不是作简单的代换换,而是对类型说明符重新命名。被命名的标识符,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。具有类型定义说明的功能。21C语言程序设计语言程序设计 温州理工学院温州理工学院 21#define vs.typedef两者形相似,两者形相似,但在功能上却不相同。但在功能上却不相同。PIN1 a,b;在宏代换后变成在宏代换后变成:int*a,b;表示表示a是指向整是指向整型的指针变量,而型的指针变量,而b是整型变量。是整型变量。PIN2 a,b;表示表示a、b都是指向整型的指针变量。因都是指向整型的指针变量。因为为PIN2是一个类型说明符。是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型,由这个例子可见,宏定义虽然也可表示数据类型,但毕竟是作字符代换。在使用时要分外小心,以但毕竟是作字符代换。在使用时要分外小心,以避出错。避出错。#define PIN1 int*typedef(int*)PIN2;22C语言程序设计语言程序设计 温州理工学院温州理工学院 22带参宏定义带参宏定义C语言语言允许宏带有参数。在宏定义中的参数称允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。且要用实参去代换形参。带参宏定义的一般形式为:带参宏定义的一般形式为:#define 宏名宏名(形参表形参表)字符串字符串在字符串中含有各个形参在字符串中含有各个形参。23C语言程序设计语言程序设计 温州理工学院温州理工学院 23带参宏定义带参宏定义带带参宏调用的一般形式为:参宏调用的一般形式为:宏名宏名(实参表实参表);例如:例如:#define M(y)y*y+3*y/*宏定义宏定义*/k=M(5);/*宏调用宏调用*/在宏调用时,用实参在宏调用时,用实参5 去代替形参去代替形参y,经预处理宏,经预处理宏展开后的语句为:展开后的语句为:k=5*5+3*524C语言程序设计语言程序设计 温州理工学院温州理工学院 24带参宏定义带参宏定义带参宏定义带参宏定义#define MAX(a,b)(ab)?a:bmain()int x,y,max;printf(input two numbers:);scanf(%d%d,&x,&y);max=MAX(x,y);printf(max=%dn,max);用宏名用宏名MAX 表示条表示条件表达式件表达式(ab)?a:b,形参形参a,b 均出现在条件均出现在条件表达式中。表达式中。max=MAX(x,y)为宏为宏调用,实参调用,实参x,y,将代,将代换形参换形参a,b。宏展开后。宏展开后该语句为:该语句为:max=(xy)?x:y;25C语言程序设计语言程序设计 温州理工学院温州理工学院 25带参的宏定义使用说明带参的宏定义使用说明带参宏定义中,宏名和形参表之间带参宏定义中,宏名和形参表之间不能有空格不能有空格出现。出现。在宏定义中的形参是标识符,而宏调用中的实在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。参可以是表达式。#define MAX(a,b)(ab)?a:b不能写成:不能写成:#define MAX(a,b)(ab)?a:b26C语言程序设计语言程序设计 温州理工学院温州理工学院 26带参的宏定义使用说明带参的宏定义使用说明在带参宏定义中,形式参数不分配内存单元,在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类体的值。要用它们去代换形参,因此必须作类型说明。型说明。在函数中,形参和实参是两个不同的量,各有在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,自己的作用域,调用时要把实参值赋予形参,进行进行“值传递值传递”。而在带参宏中,只是符号代。而在带参宏中,只是符号代换,不存在值传递的问题。换,不存在值传递的问题。27C语言程序设计语言程序设计 温州理工学院温州理工学院 27带参的宏定义使用说明带参的宏定义使用说明#define SQ(y)(y)*(y)main()int a,sq;printf(input a number:);scanf(%d,&a);sq=SQ(a+1);printf(sq=%dn,sq);getch();宏定义,形参为宏定义,形参为y。宏。宏调用中实参为调用中实参为a+1,是一,是一个表达式,在宏展开时得个表达式,在宏展开时得到如下语句:到如下语句:sq=(a+1)*(a+1);这与函数的调用是不同这与函数的调用是不同的,函数调用时要把实参的,函数调用时要把实参表达式的值求出来再赋予表达式的值求出来再赋予形参。而宏代换中对实参形参。而宏代换中对实参表达式不作计算直接地照表达式不作计算直接地照原样代换。原样代换。28C语言程序设计语言程序设计 温州理工学院温州理工学院 28带参的宏与带参函数不同带参的宏与带参函数不同SQ(int y)return(y)*(y);main()int i=1;while(i=5)printf(%dn,SQ(i+);getch();#define SQ(y)(y)*(y)main()int i=1;while(i=5)printf(%dn,SQ(i+);getch();29C语言程序设计语言程序设计 温州理工学院温州理工学院 29带参的宏与带参函数不同带参的宏与带参函数不同在例在例1中函数名为中函数名为SQ,形参为,形参为Y,函数体表达,函数体表达式为式为(y)*(y)。在例。在例2中宏名为中宏名为SQ,形参也为,形参也为y,字符串表达式为,字符串表达式为(y)*(y)。例例1的函数调用的函数调用为为SQ(i+),例,例2的宏调用为的宏调用为SQ(i+),实参也,实参也是相同的。从输出结果来看,却大不相同。是相同的。从输出结果来看,却大不相同。在例在例1中,函数调用是把实参中,函数调用是把实参i 值传给形参值传给形参y 后自增后自增1。然后输出函数值。因而要循环然后输出函数值。因而要循环5 次。输出次。输出15 的平方值。而在例的平方值。而在例2 中宏调用时,只作代换。中宏调用时,只作代换。SQ(i+)被代换为被代换为(i+)*(i+)。30C语言程序设计语言程序设计 温州理工学院温州理工学院 30带参的宏与带参函数不同带参的宏与带参函数不同在第一次循环时,由于在第一次循环时,由于i 等于等于1,其计算过程为:,其计算过程为:表达式中前一个表达式中前一个i 初值为初值为1,然后,然后i 自增自增1 变为变为2,因此表达式中第,因此表达式中第2 个个i 初值为初值为2,两相乘的结果,两相乘的结果也为也为2,然后,然后i 值再自增值再自增1,得,得3。在第二次循环时,在第二次循环时,i 值已有初值为值已有初值为3,因此表达,因此表达式中前一个式中前一个i 为为3,后一个,后一个i为为4,乘积为,乘积为12,然后,然后i 再自增再自增1 变为变为5。进入第三次循环,由于进入第三次循环,由于i 值已为值已为5,所以这将是,所以这将是最后一次循环。计算表达式的值为最后一次循环。计算表达式的值为5*6 等于等于30。i 值再自增值再自增1 变为变为6,不再满足循环条件,停止循,不再满足循环条件,停止循环。环。31函数调用和宏调用函数调用和宏调用函数调用函数调用宏调用宏调用 信息传递信息传递 实参的值或地址传送实参的值或地址传送给形参。给形参。用实参的字符串替换形参。用实参的字符串替换形参。内存分配内存分配程序运行时处理,分程序运行时处理,分配临时内存单元。配临时内存单元。宏展开在预编译时处理,宏展开在预编译时处理,不存在分配内存的问题。不存在分配内存的问题。参数类型参数类型 实参和形参类型一致。实参和形参类型一致。如不一致,编译器进如不一致,编译器进行类型转换。行类型转换。作字符串替换,不存在参作字符串替换,不存在参数类型问题。数类型问题。返回值返回值 可以有一个返回值。可以有一个返回值。作字符串替换,不存在返作字符串替换,不存在返回值问题。回值问题。对源程序对源程序无影响。无影响。宏展开后使程序加长。宏展开后使程序加长。时间占用时间占用 占用程序运行时间。占用程序运行时间。占用编译时间。占用编译时间。32C语言程序设计语言程序设计 温州理工学院温州理工学院 32宏定义宏定义(contd)宏定义也可用来定义多个语句,在宏调用时,宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。把这些语句又代换到源程序内。#define SV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main()int l=3,w=4,h=5,sa,sb,sc,vv;SV(sa,sb,sc,vv);printf(sa=%dnsb=%dn sc=%dnvv=%dn,sa,sb,sc,vv);getch();33C语言程序设计语言程序设计 温州理工学院温州理工学院 33第十一讲编译预处理第十一讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间34C语言程序设计语言程序设计 温州理工学院温州理工学院 34“文件包含文件包含”处理处理所谓所谓“文件包含文件包含”处理是指一个源文件可以将另外一处理是指一个源文件可以将另外一个源文件的全部内容包含进来。个源文件的全部内容包含进来。C语言提供了语言提供了#include命令用来实现命令用来实现“文件包含文件包含”的操作。的操作。其一般形式为其一般形式为:#include“文件名文件名“或或#include 35C语言程序设计语言程序设计 温州理工学院温州理工学院 35“文件包含文件包含”处理处理(contd)在程序设计中,文件包含是很有用的。一个大在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块,由多个程序员分别的程序可以分为多个模块,由多个程序员分别编程。编程。有些公用的符号常量或宏定义等可单独组成一有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该个文件,在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头文件即可使用。这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少都去书写那些公用量,从而节省时间,并减少出错。出错。36C语言程序设计语言程序设计 温州理工学院温州理工学院 36“文件包含文件包含”处理处理(contd)包含命令中的文件名可以用包含命令中的文件名可以用双引号双引号括起来,也可括起来,也可以用以用尖括号尖括号括起来。用户编程时可根据自己文件括起来。用户编程时可根据自己文件所在的目录来选择某一种命令形式。所在的目录来选择某一种命令形式。#includestdio.h#include前者表示首先在当前的源文件目录中查找,前者表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。若未找到才到包含目录中去查找。后者表示在包含文件目录中去查找后者表示在包含文件目录中去查找(包含目包含目录是由用户在设置环境时设置的录是由用户在设置环境时设置的),而不在源,而不在源文件目录查找。文件目录查找。37C语言程序设计语言程序设计 温州理工学院温州理工学院 37“文件包含文件包含”处理处理(contd)一个一个include 命令只能指定一个被包含文件,若命令只能指定一个被包含文件,若有多个文件要包含,则需用多个有多个文件要包含,则需用多个include 命令。命令。文件包含允许嵌套,即在一个被包含的文件中文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。又可以包含另一个文件。从理论上说,从理论上说,#include命令可以包含任何类型命令可以包含任何类型的文件,只要这些文件的内容被扩展后符合的文件,只要这些文件的内容被扩展后符合C语言语法。一般语言语法。一般#include命令用于包含扩展名命令用于包含扩展名为为.h的的“头文件头文件”,如,如stdio.h、string.h、math.h。在这些文件中,一般定义符号常量、。在这些文件中,一般定义符号常量、宏,或声明函数原型。宏,或声明函数原型。38C语言程序设计语言程序设计 温州理工学院温州理工学院 38“文件包含文件包含”处理处理(contd)被包含的文件与其所在的文件,在预处理后,被包含的文件与其所在的文件,在预处理后,成为一个文件,因此,如果被包含文件定义有成为一个文件,因此,如果被包含文件定义有全局变量,在其所在文件中不必用全局变量,在其所在文件中不必用extern关键关键字声明。但一般不在被包含文件中定义变量。字声明。但一般不在被包含文件中定义变量。39C语言程序设计语言程序设计 温州理工学院温州理工学院 39“文件包含文件包含”处理处理(contd)文件一:文件名为文件一:文件名为Area.h;文件内容如下:;文件内容如下:#define PI 3.1415926535#define S(r)PI*r*r文件二:文件名为文件二:文件名为myfile.c;文件内容如下:;文件内容如下:#include Area.h /*预处理时替换为预处理时替换为Area.h*/void main()float a,area;a=5;area=S(a);printf(r=%fnarea=%fn,a,area);在编译时并不是分别对两在编译时并不是分别对两个文件分别进行编译,个文件分别进行编译,然然后再将它们的目标程序连接后再将它们的目标程序连接的。的。而是在经过编译预处理后而是在经过编译预处理后将头文件将头文件Area.h包含到主文包含到主文件中,得到一个新的源程序,件中,得到一个新的源程序,然后对这个文件进行编译,然后对这个文件进行编译,得到一个目标(得到一个目标(.obj)文件。)文件。被包含的文件成为新的源文被包含的文件成为新的源文件的一部分,而单独生成目件的一部分,而单独生成目标文件。标文件。40C语言程序设计语言程序设计 温州理工学院温州理工学院 40第十一讲编译预处理第十一讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间41C语言程序设计语言程序设计 温州理工学院温州理工学院 41条件编译条件编译预处理程序提供了条件编译的功能。可以按不预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。同的目标代码文件。条件编译有三种形式:条件编译有三种形式:#ifdef 标识符标识符 程序段程序段1#else 程序段程序段2#endif#ifndef 标识符标识符 程序段程序段1#else 程序段程序段2#endif#if 表达式表达式 程序段程序段1#else 程序段程序段2#endif 42C语言程序设计语言程序设计 温州理工学院温州理工学院 42条件编译条件编译 如果标识符已被如果标识符已被#define 命令定义过,则对程序段命令定义过,则对程序段1 进行编译;否则对程序进行编译;否则对程序段段2进行编译。进行编译。如果没有程序段如果没有程序段2(它为它为空空),本格式中的,本格式中的#else可以可以缺省。缺省。#ifdef 标识符标识符 程序段程序段1#else 程序段程序段2#endif 43C语言程序设计语言程序设计 温州理工学院温州理工学院 43条件编译条件编译 与第一种形式的区别是与第一种形式的区别是:将将“ifdef”改为改为“ifndef”。它的功能是。它的功能是:如果标识符未被如果标识符未被#define命命令定义过则对程序段令定义过则对程序段1进行进行编译,否则对程序段编译,否则对程序段2进行进行编译。编译。如果没有程序段如果没有程序段2(它为它为空空),本格式中的,本格式中的#else可以可以缺省。缺省。#ifndef 标识符标识符 程序段程序段1#else 程序段程序段2#endif 44C语言程序设计语言程序设计 温州理工学院温州理工学院 44条件编译条件编译 如常量表达式的值为真如常量表达式的值为真(非非0),则对程序段,则对程序段1进行进行编译,否则对程序段编译,否则对程序段2进行进行编译。因此可以使程序在编译。因此可以使程序在不同条件下,完成不同的不同条件下,完成不同的功能。功能。本格式中的本格式中的#else通常不通常不可以缺省。可以缺省。#if 表达式表达式 程序段程序段1#else 程序段程序段2#endif 45C语言程序设计语言程序设计 温州理工学院温州理工学院 45条件编译条件编译(contd)#define R 1main()float c,r,s;printf(input a number:);scanf(%f,&c);#if Rr=3.14159*c*c;printf(“Area:%fn,r);#elses=c*c;printf(“Area:%fn,s);#endif在宏定义中,定义在宏定义中,定义R为为1,因此,在条件编译时,因此,在条件编译时,常量表达式的值为真。常量表达式的值为真。用条件语句将会对整用条件语句将会对整个源程序进行编译,目个源程序进行编译,目标代码程序较长,而条标代码程序较长,而条件编译,则根据条件只件编译,则根据条件只编译部分程序段,目标编译部分程序段,目标程序较短。程序较短。46C语言程序设计语言程序设计 温州理工学院温州理工学院 46第十一讲编译预处理第十一讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间47C语言程序设计语言程序设计 温州理工学院温州理工学院 47程序应用举例程序应用举例#define PR printf#define NL n#define D%d#define F%f#define S%s void main()int a=5,b=8;float x=4.3,y=2.7108;char ch=You are good!;PR(D F NL,a,x);/*即即printf(%d%f n,a,x);*/PR(D D F F NL,a,b,x,y);PR(S NL,ch);48C语言程序设计语言程序设计 温州理工学院温州理工学院 48程序应用举例程序应用举例输入一个圆的半径,输出圆的面积。定义带参输入一个圆的半径,输出圆的面积。定义带参数的宏数的宏S(r),程序如下,程序如下:#define PI 3.1415926535#define S(r)PI*r*rvoid main()float a=5.0,area;area=S(a);printf(r=%f area=%fn,a,area);可解决无参数宏定义中,替换字符串中含有其他字符,可解决无参数宏定义中,替换字符串中含有其他字符,编译时出现标识符(变量)未定义错误的情况。编译时出现标识符(变量)未定义错误的情况。49C语言程序设计语言程序设计 温州理工学院温州理工学院 49程序应用举例程序应用举例根据是否定义宏决定是计算球的体积或表面积:根据是否定义宏决定是计算球的体积或表面积:#define PI 3.1415926#define VOL(r)(4.0/3*PI*(r)*(r)*(r)void main()double r,v,s;printf(Enter The Radiusn);scanf(%lf,&r);#ifdef VOL v=VOL(r);printf(The Vol=%lfn,v);#else s=4*PI*r*r;printf(The Area=%lfn,s);#endif50C语言程序设计语言程序设计 温州理工学院温州理工学院 50第十一讲编译预处理第十一讲编译预处理概述概述宏定义宏定义“文件包含文件包含”处理处理条件编译条件编译程序应用举例程序应用举例小结小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间51C语言程序设计语言程序设计 温州理工学院温州理工学院 51本章小结本章小结预处理功能预处理功能是是C语言语言特有的功能,它是在对源程序特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。中用预处理命令来调用这些功能。宏定义是用一个标识符来表示一个字符串,这个宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。将用该字符串代换宏名。宏定义可以带有参数,宏调用时是以实参代换形宏定义可以带有参数,宏调用时是以实参代换形参。而不是参。而不是“值传送值传送”。为了避免宏代换时发生错误,宏定义中字符串应为了避免宏代换时发生错误,宏定义中字符串应加括号,字符串中出现的形式参数两边应加括号。加括号,字符串中出现的形式参数两边应加括号。52C语言程序设计语言程序设计 温州理工学院温州理工学院 52本章小结本章小结(contd)文件包含是预处理的一个重要功能,它可用来文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。果将生成一个目标文件。条件编译允许只编译源程序中满足条件的程序条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。的开销并提高了程序的效率。使用预处理功能便于程序的修改、阅读、移植使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。和调试,也便于实现模块化程序设计。53C语言程序设计语言程序设计 温州理工学院温州理工学院 53网络资源网络资源http:/(教学站点教学站点)http:/cpp.ga- 温州理工学院温州理工学院 54Questions-Discussion55C语言程序设计语言程序设计 温州理工学院温州理工学院 55作业提交作业提交作业提交作业提交实验报告提交实验报告提交ftp:/10.172.250.252:116156C语言程序设计语言程序设计 温州理工学院温州理工学院 56再再 见见376458575Algorithms+Data Structures=ProgramsCopyright 2021 Wenzhou University of Technology.All rights reserved.This presentation,slides,or hardcopy may NOT be used for short courses,industry seminars,or consulting purposes.The names of actual companies and products mentioned herein may be the trademarks of their respe

    注意事项

    本文((6.17)--补充课件第11讲-编译预处理.ppt)为本站会员(奉***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开