C语言培训教材课件第6章

上传人:hs****ma 文档编号:569399872 上传时间:2024-07-29 格式:PPT 页数:20 大小:100.50KB
返回 下载 相关 举报
C语言培训教材课件第6章_第1页
第1页 / 共20页
C语言培训教材课件第6章_第2页
第2页 / 共20页
C语言培训教材课件第6章_第3页
第3页 / 共20页
C语言培训教材课件第6章_第4页
第4页 / 共20页
C语言培训教材课件第6章_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《C语言培训教材课件第6章》由会员分享,可在线阅读,更多相关《C语言培训教材课件第6章(20页珍藏版)》请在金锄头文库上搜索。

1、烟台大学烟台大学 计算机学院计算机学院刘刘 培培 华华第第6 6章章 编译预处理编译预处理2005年3月1主要内容主要内容 l编译预处理编译预处理l多文件程序的调试方法多文件程序的调试方法l条件编译条件编译2005年3月2源文件源文件源文件源文件 *.*.*.*.c c c c运行文件运行文件运行文件运行文件*.*.*.*.exeexeexeexe编译编译编译编译编译编译编译编译编译编译编译编译目标文件目标文件目标文件目标文件*.*.*.*.objobjobjobj连接连接连接连接编译编译编译编译连接连接连接连接连接连接连接连接编译预处理编译预处理编译预处理编译预处理 编编编编 译译译译编译预

2、处理包括:编译预处理包括: 宏定义宏定义 文件包含文件包含 条件编译条件编译6.1 编译预处理编译预处理2005年3月36.1 编译预处理(续)编译预处理(续)源文件源文件源文件源文件 *.*.*.*.c c c c运行文件运行文件运行文件运行文件*.*.*.*.exeexeexeexe目标文件目标文件目标文件目标文件*.*.*.*.objobjobjobj编译编译编译编译连接连接连接连接main()main()main()main() float r,s,c; float r,s,c; float r,s,c; float r,s,c; scanf(“%f”,&r); scanf(“%f”,

3、&r); scanf(“%f”,&r); scanf(“%f”,&r); s = r * r * ; s = r * r * ; s = r * r * ; s = r * r * ; c = 2 * r * ; c = 2 * r * ; c = 2 * r * ; c = 2 * r * ; printf(“s=%f, c=%f”,s,c); printf(“s=%f, c=%f”,s,c); printf(“s=%f, c=%f”,s,c); printf(“s=%f, c=%f”,s,c); 如何修如何修改圆周率改圆周率2005年3月4# # # #definedefinedefine

4、define 宏名宏名宏名宏名 字符串字符串字符串字符串宏定义的功能:宏定义的功能:宏定义的功能:宏定义的功能: 在进行编译前,用在进行编译前,用在进行编译前,用在进行编译前,用字符串字符串字符串字符串原样替换程序中的原样替换程序中的原样替换程序中的原样替换程序中的宏宏宏宏名名名名。 这个替换过程称为这个替换过程称为这个替换过程称为这个替换过程称为“宏替换宏替换宏替换宏替换”或或或或“宏展开宏展开宏展开宏展开”,字符串字符串字符串字符串也称为替换文本。也称为替换文本。也称为替换文本。也称为替换文本。 命令的一般格式:命令的一般格式:命令的一般格式:命令的一般格式:6.1.1 不带参数的宏定义不

5、带参数的宏定义6.1 编译预处理(续)编译预处理(续)2005年3月56.1 编译预处理(续)编译预处理(续)例如:例如:#define #define PIPI main()main()main()main() float r,s,c; float r,s,c; float r,s,c; float r,s,c; scanf(“%f”,&r); scanf(“%f”,&r); scanf(“%f”,&r); scanf(“%f”,&r); s = r * r * s = r * r * s = r * r * s = r * r * PIPIPIPI; ; ; ; c = 2 * r * c

6、 = 2 * r * c = 2 * r * c = 2 * r * PIPIPIPI; ; ; ; printf(“s=%f, printf(“s=%f, printf(“s=%f, printf(“s=%f, c=%f”,s,c);c=%f”,s,c);c=%f”,s,c);c=%f”,s,c); 替替换换编编 译译2005年3月66.1 编译预处理(续)编译预处理(续)为了增加程序的可读性,建议宏名用大写字母,其为了增加程序的可读性,建议宏名用大写字母,其为了增加程序的可读性,建议宏名用大写字母,其为了增加程序的可读性,建议宏名用大写字母,其他的标识符用小写字母。他的标识符用小写字母。他

7、的标识符用小写字母。他的标识符用小写字母。双引号中有与宏名相同的字符串不进行替换。双引号中有与宏名相同的字符串不进行替换。双引号中有与宏名相同的字符串不进行替换。双引号中有与宏名相同的字符串不进行替换。已经定义的宏名可以被后定义的宏名引用。在预处已经定义的宏名可以被后定义的宏名引用。在预处已经定义的宏名可以被后定义的宏名引用。在预处已经定义的宏名可以被后定义的宏名引用。在预处理时将层层进行替换。理时将层层进行替换。理时将层层进行替换。理时将层层进行替换。说明说明: 宏定义的作用域是从定义处开始到源文件结束,宏定义的作用域是从定义处开始到源文件结束,宏定义的作用域是从定义处开始到源文件结束,宏定

8、义的作用域是从定义处开始到源文件结束, 但根据需要可用但根据需要可用但根据需要可用但根据需要可用undefundef命令终止其作用域。形式为命令终止其作用域。形式为命令终止其作用域。形式为命令终止其作用域。形式为: : #undef #undef #undef #undef 宏名宏名宏名宏名2005年3月7【例例6.1】不带参数的宏定义。不带参数的宏定义。源程序:源程序:源程序:源程序:#define S PI*r*r#define S PI*r*r#define S PI*r*r#define S PI*r*r#define V 4*S*r/3#define V 4*S*r/3#define

9、 V 4*S*r/3#define V 4*S*r/3main( )main( )main( )main( )float r;float r;float r;float r; printf(nInput r:); printf(nInput r:); printf(nInput r:); printf(nInput r:); scanf(%f,&r); scanf(%f,&r); scanf(%f,&r); scanf(%f,&r); printf(S=%.2f V=%.2fn, printf(S=%.2f V=%.2fn, printf(S=%.2f V=%.2fn, printf(S=%.

10、2f V=%.2fn,S S S S, , , ,V V V V);););); 编译预处理后的程序:编译预处理后的程序:main( )main( ) float r; float r; printf(nInput r:); printf(nInput r:); scanf(%f,&r); scanf(%f,&r); printf(S=%.2f V=%.2fn, printf(S=%.2f V=%.2fn, 3.14*r*r 3.14*r*r, , 4*4* 3.14*r*r3.14*r*r *r/3*r/3); ); SVSV进入编译进入编译进入编译进入编译2005年3月8命令的一般形式命令

11、的一般形式命令的一般形式命令的一般形式6.1.2 带参数的宏定义带参数的宏定义#define #define #define #define 宏名宏名宏名宏名( ( ( (形参表形参表形参表形参表) ) ) ) 字符串字符串字符串字符串功能功能: 在编译预处理时,把源程序中所有在编译预处理时,把源程序中所有带参数的宏名带参数的宏名用宏定义中的用宏定义中的字符串字符串替换,并且用宏名后圆括号中替换,并且用宏名后圆括号中的的实参替换实参替换字符串中的字符串中的形参形参。例如:例如:#define MAX(X,Y) (X)(Y)?(X):(Y)6.1 编译预处理(续)编译预处理(续)2005年3月9

12、6.1 编译预处理(续)编译预处理(续)【例例例例6.306.30】带参数的宏定义。带参数的宏定义。带参数的宏定义。带参数的宏定义。#define MAX(x,y) #define MAX(x,y) (x)(y)?(x):(y)(x)(y)?(x):(y)main( )main( ) printf(%dn,a,b, printf(%dn,a,b, MAX(a,b)MAX(a,b); ); printf(%dn, printf(%dn,MAX(a+m,b+n)MAX(a+m,b+n); ); 分两次替换:分两次替换:将宏名将宏名MAX(a,b)MAX(a,b) 替换成字符串替换成字符串 (x)(

13、y)?(x):(y)(x)(y)?(x):(y)。用实参用实参a替换形参替换形参x,实参,实参b替换形参替换形参y。程序中的两个程序中的两个printf语句被展开为:语句被展开为:printf(%dn, (a)(b)?(a):(b); printf(%dn, (a+m)(b+n)?( a+m):( b+n);2005年3月106.1 编译预处理(续)编译预处理(续)【例例例例6.36.3】分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。#define MA(x) #define MA(x) x*(x-1)x*(x-1)ma

14、in( )main( ) int a=1,b=2; int a=1,b=2; printf(%dn, printf(%dn, MA(1+a+b)MA(1+a+b); ); 分两次替换:分两次替换: MA(1+a+b)MA(1+a+b) 用用x*(x-1)x*(x-1) 替换。替换。用用1+a+b替换替换x。printf语句被展开为:语句被展开为:printf(%dn, 1+a+b*(1+a+b-1);特别注意:特别注意:由于替换文由于替换文本中的本中的x没没有用括号括有用括号括起,因此,起,因此,1+a+b也不也不能用括号括能用括号括起。起。程序输出结果:程序输出结果:82005年3月116.

15、1 编译预处理(续)编译预处理(续)命令的一般形式命令的一般形式命令的一般形式命令的一般形式格式格式格式格式1 1: #include #include 格式格式格式格式2 2: #include #include 文件名文件名文件名文件名 6.1.3 文件包含文件包含文件包含是将指定的某个源文件的内容全部包文件包含是将指定的某个源文件的内容全部包文件包含是将指定的某个源文件的内容全部包文件包含是将指定的某个源文件的内容全部包含到当前文件中。用含到当前文件中。用含到当前文件中。用含到当前文件中。用includeinclude命令实现。命令实现。命令实现。命令实现。用用用用格式格式格式格式1 1

16、,预处理程序仅在,预处理程序仅在,预处理程序仅在,预处理程序仅在TCINCLUDETCINCLUDE目录下查目录下查目录下查目录下查找指定文件。找指定文件。找指定文件。找指定文件。用用用用格式格式格式格式2 2,预处理程序首先在,预处理程序首先在,预处理程序首先在,预处理程序首先在当前目录中当前目录中当前目录中当前目录中查找指定查找指定查找指定查找指定文件,若找不到再到文件,若找不到再到文件,若找不到再到文件,若找不到再到TCINCLUDETCINCLUDE目录中查找。目录中查找。目录中查找。目录中查找。2005年3月126.1 编译预处理(续)编译预处理(续)例如:调用例如:调用例如:调用例

17、如:调用sin(x) sin(x) 函数时,要在程序的开头使用函数时,要在程序的开头使用函数时,要在程序的开头使用函数时,要在程序的开头使用如下命令:如下命令:如下命令:如下命令:#include #include 在预处理时,用文件内容替换在预处理时,用文件内容替换在预处理时,用文件内容替换在预处理时,用文件内容替换 #include #include 命令行。命令行。命令行。命令行。2功能功能在预处理时,将在预处理时,将在预处理时,将在预处理时,将includeinclude命令后指定文件的内命令后指定文件的内命令后指定文件的内命令后指定文件的内容替换该命令行。容替换该命令行。容替换该命令

18、行。容替换该命令行。2005年3月136.2 多文件程序的调试方法多文件程序的调试方法操作步骤如下:操作步骤如下:操作步骤如下:操作步骤如下: 在在在在TC TC 环境下建立一个工程文件(环境下建立一个工程文件(环境下建立一个工程文件(环境下建立一个工程文件(扩展名为扩展名为扩展名为扩展名为prjprj) ),设文件名为,文件内容如下:设文件名为,文件内容如下:设文件名为,文件内容如下:设文件名为,文件内容如下:若这个文件不在当前盘或当前路径下,需要在文件若这个文件不在当前盘或当前路径下,需要在文件若这个文件不在当前盘或当前路径下,需要在文件若这个文件不在当前盘或当前路径下,需要在文件名前加盘

19、符和路径。如果已经将源文件编译成目标文名前加盘符和路径。如果已经将源文件编译成目标文名前加盘符和路径。如果已经将源文件编译成目标文名前加盘符和路径。如果已经将源文件编译成目标文件,可在工程文件中直接写目标文件名。件,可在工程文件中直接写目标文件名。件,可在工程文件中直接写目标文件名。件,可在工程文件中直接写目标文件名。1. 使用工程文件将多个文件连接成一个可使用工程文件将多个文件连接成一个可执行文件的方法执行文件的方法例如:将、和合并成一个可执行文件例如:将、和合并成一个可执行文件例如:将、和合并成一个可执行文件例如:将、和合并成一个可执行文件。2005年3月146.2 多文件程序的调试方法(

20、续)多文件程序的调试方法(续) 在在在在TCTC主菜单的主菜单的主菜单的主菜单的“ “ProjectProject” ”下拉菜单中选择下拉菜单中选择下拉菜单中选择下拉菜单中选择“ “Project nameProject name” ”项,输入文件名(文件名前也项,输入文件名(文件名前也项,输入文件名(文件名前也项,输入文件名(文件名前也可以加盘符和路径)。可以加盘符和路径)。可以加盘符和路径)。可以加盘符和路径)。 在在在在TCTC环境下,按环境下,按环境下,按环境下,按Ctrl+F9Ctrl+F9,系统首先找到工程,系统首先找到工程,系统首先找到工程,系统首先找到工程文件,然后将文件,然后

21、将文件,然后将文件,然后将、和分别进行编译、和分别进行编译、和分别进行编译、和分别进行编译,若编译没通过,若编译没通过,若编译没通过,若编译没通过,根据根据根据根据出错信息出错信息出错信息出错信息检查、修改源程序,然后再按检查、修改源程序,然后再按检查、修改源程序,然后再按检查、修改源程序,然后再按Ctrl+F9Ctrl+F9重新编译。若编译通过,系统自动生成重新编译。若编译通过,系统自动生成重新编译。若编译通过,系统自动生成重新编译。若编译通过,系统自动生成三个对应的目标文件:三个对应的目标文件:三个对应的目标文件:三个对应的目标文件:file1.obj file1.obj 、file2.o

22、bj file2.obj 和和和和 。接着系统自动进行接着系统自动进行接着系统自动进行接着系统自动进行连接连接连接连接,连接连接连接连接成功则生成并自动成功则生成并自动成功则生成并自动成功则生成并自动执行该程序。执行该程序。执行该程序。执行该程序。2005年3月156.2 多文件程序的调试方法(续)多文件程序的调试方法(续)2. 使用文件包含命令将多个文件连接成一个可使用文件包含命令将多个文件连接成一个可执行文件的方法执行文件的方法2005年3月166.2 多文件程序的调试方法(续)多文件程序的调试方法(续)#include file2.c#include file3.cABCBCA预处理前预

23、处理前预处理后预处理后2005年3月176.3 条件编译条件编译实现条件编译的格式有如下三种实现条件编译的格式有如下三种:格式一:格式一:格式一:格式一:#ifdef #ifdef #ifdef #ifdef 宏名宏名宏名宏名程序段程序段程序段程序段1 1 1 1#else#else#else#else程序段程序段程序段程序段2 2 2 2#endif#endif#endif#endif条件编译:条件编译:是对源程序中的某段程序通过条件来控制是是对源程序中的某段程序通过条件来控制是否参加本次编译。否参加本次编译。2005年3月186.3 条件编译(续)条件编译(续)格式二:格式二:格式二:格式二:#ifndef #ifndef #ifndef #ifndef 宏名宏名宏名宏名程序段程序段程序段程序段1 1 1 1#else#else#else#else程序段程序段程序段程序段2 2 2 2#endif#endif#endif#endif2005年3月196.3 条件编译(续)条件编译(续)格式三:格式三:格式三:格式三:#if #if #if #if 条件条件条件条件程序段程序段程序段程序段1 1 1 1#else#else#else#else程序段程序段程序段程序段2 2 2 2#endif#endif#endif#endif2005年3月20

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号