- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 编译预处理 8.1【案例32】字符分类 ● 编译预处理的概念 ● 宏定义 8.2【案例33】文件包含 ● 文件包含的意义 ● 文件包含的应用 8.3【案例34】条件编译 ● 条件编译的概念 8.1【案例32】字符分类 8.2【案例33】文件包含 8.3【案例34】条件编译 8.1 【案例32】字符分类 案例效果 本案例程序在执行时将把用户输入的字符串中的各种字符进行分类,程序运行效果如图8-1-1所示。 图8-1-1 字符分类 在本案例的实现过程中,将学习编译预处理中的宏定义及其应用。 设计过程(见书) 1.编译预处理的概念 相关知识 1.编译预处理的概念 编译预处理是指在编译系统对文件进行编译(包括词法分析、语法分析、代码生成及优化)之前,对一些特殊的编译语句先进行处理,然后将处理的结果与源程序一起编译,生成目标文件。 在前面的学习中,已经见过很多的编译预处理语句,例如: #includestdio.h #define PI 3.14 编译预处理语句都是以“#”开头,其结尾不带分号(;),以表示与普通程序语句相区别。编译预处理语句分为三类:宏定义、文件包含和条件编译,它常用于程序设计的模块化、移植、调试等方面。 2.宏定义 宏定义分为不带参数的宏定义(即常量定义)与带参数的宏定义两种。 (1)不带参数的宏定义 不带参数的宏定义形式如下: #define 标识符 表达式 2.宏定义 不带参数的宏定义中的表达式可以是任意的常量,例如: #define NULL 0 #define EOF (-1) /*括号不可省略*/ #define TRUE 1 #define FALSE 0 #define PI 3.14 #define TEXT unsigned char /*将unsigned char类型用TEXT来表示*/ #define 定义时,不能重复相同的宏名定义。 宏定义完成后,在程序编译时将会用后面表达式中的常量去替换宏定义的标识符,例如: while(s!=NULL){…}; 上面的语句中,在编译预处理时,系统会先将NULL进行替换,语句变成如下形式: while(s!=0){…}; 在编译预处理完成后,再进行程序的编译。 2.宏定义 由于编译预处理在这里只是作简单的替换,所以对后边的字符串常量需要加上括号,否则,将会出现错误,例如: #define A 3 #define TA (2+A) main() { … s=3*TA; … } 上面是正确的宏定义方式,在编译预处理时会将语句s=3*TA替换为s=3*(2+3)。如果没有括号,则会出现下面所示的错误: #define A 3 #define TA 2+A main() { … s=3*TA; … } 在上面的程序段中,编译预处理时会将语句s=3*TA替换为s=3*2+3,由于运算符的优先级不同,导致结果发生错误。 2.宏定义 编译预处理只是对宏定义的标识符用后面的表达式进行简单替换,而不是对其内容进行解析。 (2)带参数的宏定义 带参数的宏定义中,宏替换名可以带有形式参数,? 在程序中用到时, 实际参数会代替这些形式参数。 带参数的宏定义形式如下: #define 宏名(参数表) 表达式 编译预处理时,系统会将程序中出现宏名和参数表的地方用后边的带参数的表达式进行替换,例如: #define max(x,y) ((x)(y)?(x):(y)) /*参数必须加括号*/ 如果在程序中有如下调用: a=max(n+b,k+a); 系统将会按下面的形式进行替换: a=((n+b)(k+a)?(n+b):(k+a)); /*若不加括号,替换后由于 优先级关系极易出错*/ 在预处理的替换完成后,程序再进行编译。 2.宏定义 (3)宏的作用范围 宏也具有一定的作用范围,默认情况下,宏的作用范围从定义点开始,到程序源文件的末尾。 如果要在中途取消宏,可以使用命令#undef取消。例如: #define A 3 main() { … #undef A … } 上面的程序段中,当执行语句#undef A后,宏定义A将会被取消,如果以后再出现A,系统将会视为一个未定义的变量名。 (4)宏定义与函数调用 可以看出,带参数的宏定义有些像函数调用,但两者是不同的。 带参数的宏定义与函数的区别如下。 宏定义仅是对字符串作简单替换,而函数调用则是按程序的含义来替换形式参数。 宏定义仅能用于简单的单行语句替换,而函数可用于复杂运算。
您可能关注的文档
- C语言程序设计(第二版)电子教案张昕 第10章 C++面向对象程序设计.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch1.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch3.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch4.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch5.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch6.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch7.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch8.ppt
- C语言程序设计(第三版) 教学课件 作者 林小茶 C_ch9.ppt
- C语言程序设计(第三版) 教学课件 作者 罗坚 王声决 主编 第1章 C程序设计入门.ppt
- C语言程序设计案例教程 教学课件 作者 沈大林 等 目录.ppt
- C语言程序设计案例教程 教学课件 作者 孙街亭 7152.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第1章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第2章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第3章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第4章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第5章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第6章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第7章.ppt
- C语言程序设计案例教程 教学课件 作者 杨旭 第8章.ppt
文档评论(0)