- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(C语言课件)第11部分 编译预处理
第十一部分 程序结构其它问题 编译预处理 一、编译预处理 预处理命令 C源程序中以字符#开始的命令即为预处理命令 常见的预处理命令包括 #include #define #undef #if #else #elif #endif 1. 文件包含命令 把指定文件内容包含到当前源文件 #include 文件名 形式1 #include 文件名 形式2 形式1 用于包含系统头文件,预处理程序到指定目录找文件(通常指定几个系统文件目录)。 形式2 用于包含自己的文件。预处理程序先在源文件所在的目录里找,找不到时再到指定目录中去找。 处理过程 在文件系统中查找指定的文件 如果找到,就用找到的文件的内容取代该命令行。 被包含文件里如有预处理行也会处理。 说明 stdio.h, math.h等标准头文件都在系统子目录里(目录名为 include或h),这些文件中的内容一般包括 标准函数原型 系统使用的符号常量定义等。 使用include命令包含这种文件相当于在源文件中写这些函数原型和定义,使编译程序能正确完成对标准库函数调用的处理。 注意 写程序时一定要包含必要的系统头文件。 2.宏定义与宏替换 #define开始,具有两种形式 简单宏定义,形式 #define 宏名字 替代正文 说明 替代正文可以是任意正文序列,到换行为止。 如最后是“\”,下一行还作为宏定义的继续。 作用 为宏名字定义替代正文 宏展开、宏替换。 预处理程序会记录宏名字及其替代正文。处理过程如果在源程序中遇到宏名字标识符时,就用替代正文替换。 注意 替代正文里也允许出现宏名字,替代正文里宏名字会被展开。 程序中的字符串如果有与宏名相同的串,将不会做替换。 人们常用这种方式定义符号常量。 #define NUM 30 说明 替代正文可以写任何东西。若定义 #define SLD static long double 程序中的 SLD x=2.4, y=9.16; 替换后将变成 static long double x=2.4, y=9.16; 例,可以写如下形式的定义 #define NOSTOP while(1) 预处理程序做正文替换,替代正文可以是任何字符序列。 3. 带参数宏定义 #define 宏名字(参数列表) 替代正文 注意 宏名字与括号间不能有空格 用逗号分隔的标识符看作参数。 替换正文为任意正文序列。 使用形式与函数调用类似,以类似参数的形式给出宏参数的替代段,用逗号分隔,称为宏调用。 例 #define min(A,B) ((A)(B)?(A):(B)) z = min(x+y, x*y); 宏调用的替换分两步展开 先用各实参替代宏定义替代正文里的参数; 再将代换的结果代入宏调用位置预处理中将被展开为 z = ((x+y)(x*y) ? (x+y) : (x*y)); 使用括号避免出错 替代正文各参数和整段应括起,避免出错。例如 #define square(x) x * x 在特定环境下可能出问题, 例如 z = square(a + b); 展开后变成 z = a + b * a + b; 带参宏与函数调用不同 只是在程序预加工阶段中在源代码中展开。并不会在程序执行阶段执行调用动作。 宏定义和调用中没有类型问题。 一个宏能否使用、使用中发生什么、能否得到预期效果,完全看展开后的情况。 注意 宏展开可能引起参数多次计算,要慎重使用 如 z = min(n++, m++); 展开后的形式是 z = ((n++) (m++)?(n++):(m++)) 说明 人们有时用宏定义简化程序书写。 带参宏的展开可避免函数调用开销,但使程序变长。 复杂宏定义展开后出错很难定位。 应谨慎使用(尽量少使用)宏。 写宏定义的常见错误是在定义行最后写分号。该分号将被代入程序,有可能引起语法错误。 宏定义从定义处起作用直到文件结束。一个文件里不允许对同一宏名字重复定义。 #undef取消已有定义 #undef 宏名字 4. 条件编译命令 #if #else #elif #endif #if、#elif要求有一个能求出值的静态整型表达式 另两个单独成行 将部分源程序分成一些片段,编译时 条件成立时保留一些片段,否则丢掉 根据条件成立与否从两段中取一段 根据多个条件决定从多段中取一段 条件应该是整数表达式,0表示条件不成立,否则条件成立。常用 ==、!= 做判断。 例 #if TEST printf(... ...); #endif #if 整型表达式 … #else … #endif 特殊谓词defined 谓词defined。使用形式 defined 标识符 defined(标识符) 当标识符是有定义的宏名字时,defined
您可能关注的文档
- 月城镇中小学校园文化特色项目建设规划表.doc
- pspc标准的应对.ppt
- 信号系统ch3.6.ppt
- 16.1.2简谐运动中的振幅 周期 频率和相位.ppt
- 2010412023-虚拟制造.ppt
- 责任书-工商.doc
- 广东省中山一中10-11学年高一物理下学期期末考试 理.doc
- 4.3单纯形法.ppt
- 实训07 函数.doc
- 很好的英语教材.doc
- 2023年福建省公务员考试行测真题有完整答案详解.docx
- 2023年运城市公务员考试行测真题精编答案详解.docx
- 2023年聊城市公务员考试行测真题及答案详解(夺冠系列).docx
- 2023年贵阳市公务员考试行测真题及答案详解(最新).docx
- 2023年蚌埠市公务员考试行测真题及1套参考答案详解.docx
- 2023年株洲市公务员考试行测真题及1套参考答案详解.docx
- 2023年泰州市公务员考试行测真题附答案详解(黄金题型).docx
- 2023年海口市公务员考试行测真题完整参考答案详解.docx
- 2023年海南省公务员考试行测真题及参考答案详解一套.docx
- 2024国家电网招聘考试试卷含答案详解(名师推荐).docx
文档评论(0)