- 1、本文档共10页,可阅读全部内容。
- 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语言编译预处理.
第章 预处理
在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。本章介绍常用的几种预处理功能。C语言提供的预处理功能主要有下面三种:
1.宏定义
2.文件包含
3.条件编译
分别用宏定义命令,文件包含命令,条件编译命令来实现。为了与一般C语言语句区分,这些命令以符号“#”开头。
4.1宏定义在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换, 这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。 宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。 下面分别讨论这两种“宏”的定义和调用。无参宏定义无参宏的宏名后不带参数。其定义的一般形式为:#define 标识符 字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。在前面介绍过的符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义。例如: # define M (y*y+3*y)
定义M代表表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。
4.1:
#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=%d\n,s);
}
上例程序中首先进行宏定义,定义M表达式(y*y+3*y),在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)两边的括号不能少。否则会发生错误。当作以下定义后:
#difine M y*y+3*y
在宏展开时将得到下述语句:s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;
这相当于;3y2+3y+4y2+3y+5y2+3y;
显然与原题意要求不符。计算结果当然是错误的。 因此在作宏定义时必须十分注意。应保证在宏代换之后不发生错误。对于宏定义还要说明以下几点:1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。area=PI*5*5;
宏展开后,该语句变为:
area=3.1415926;*5*5;
显然有语法错误。
3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用# undef命令,例如:# define PI 3.14159
main()
{
……
}
# undef PI
f1()
{
……
}
表示PI只在main函数中有效,在f1中无效。4. 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。
4.2:
#define OK 100
main()
{
printf(OK);
printf(\n);
}
上例中定义宏名OK表示100,但在printf语句中OK被引号括起来,因此不作宏代换。程序的运行结果为:OK这表示把“OK”当字符串处理。5. 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如: #define PI 3.1415926#define S PI*y*y /* PI是已定义的宏名*/对语句:printf(%f,s);在宏代换后变为:printf(%f,3.1415926*y*y);6. 习惯上宏名用大写字母表示,以
您可能关注的文档
- 第二版新视野大学英语读写教程第二册答案..doc
- 第二版新视野大学英语读写教程第二册课后答案..doc
- 第二版新视野大学英语读写教程第四册答案(全)..doc
- 第二版新视野大学英语读写教程答案全集(一到四册)..doc
- 第二版新视野大学英语读写第四册课后答案..doc
- 第二章VirtuosoEditing..doc
- 第二章__农业生产信息化技术..doc
- 第二章_城市与城市化导学案..doc
- 第二章_院内急诊救护..doc
- 第二章+环境影响评价程序..doc
- 北交所策略北交所新质生产力后备军筛选系列二十一,关注赛英电子、康美特等.docx
- 北交所科技成长产业跟踪第三十三期:中央财经委定调推进海洋经济高质量发展,关注北交所深海经济产业链企业.docx
- 策略化选股月报:6月情绪择时组合大幅跑赢市场,当前市场情绪评分维持中高位.docx
- 策略深度报告:从白酒、新能源汽车和煤炭牛市看银行未来的时间及空间,银行:趋势的力量,坚定的胆量.docx
- 5月港口集装箱吞吐量同比增速5.4,集运远洋航线运价走势延续分化.docx
- 5月全社会债务数据综述:资金空转难持续.docx
- 6月行业信息回顾与思考:谈一谈消费行业以价换量的现状.docx
- 7月转债策略展望:估值不低、结构性仍有空间,关注主线切换.docx
- 2025年7月量化行业配置月报:小盘风格,未到拥挤时,科技望占优.docx
- 2025年中期人形机器人行业投资策略报告:量产破局,链动新机.docx
最近下载
- CAD链轮的画法 用CAD链轮的画法 实用.doc VIP
- 2025年电工技师考试题及答案.doc VIP
- 2024—2025学年江苏省苏州市沙溪高级中学高二上学期9月月考语文试卷.doc VIP
- 建筑工程项目管理制度.pdf VIP
- 运动康复中心的创新商业模式探索.docx VIP
- 员工婚丧及伤病住院慰问金实施办法.doc VIP
- TZZB 3693-2024 工程机械渗碳重载圆柱齿轮.pdf
- 护理查房急性心肌梗死护理查房.pptx VIP
- 统编版小学语文五年级上册第一单元 落花生 大单元学历案 教学设计附双减作业设计(基于新课标教学评一体化).docx VIP
- 2025年电工(技师)证考试题及电工(技师)试题答案 .pdf VIP
文档评论(0)