第5章编译预处理.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5章编译预处理

第五章 编译预处理 C提供的预处理功能主要有以下几种: 1.宏定义 2.文件包含 3.条件编译 编译预处理行均以“#”开头 5.1 宏定义(带有参数与不带参数) 形式:#define 标识符 字符串 作用:用一个指定的标识符来代表一个字 符串 不带参数的宏定义 例:#define PI 3.1415926 # define PI 3.14 main() { float area,r=3; area=PI*r*r; printf(area=%5.2f\n,area); } 程序运行结果: area=28.26 [例]求圆的面积。 每条预处理指令必须独占一行。如果串长于一行,可在行尾用反斜线“\”续行。行末不必加分号。 如:#define LONG_STRING “this is a very \ long string that is used as an example.” 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量,简单不易出错。当需要改变时,可以只改变#define 命令行,可以提高程序的可移植性。 #define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束,可以用#undef命令结束宏定义的作用域 #define MAX 100 main() {printf(MAX=%d\n,MAX); #define STRLEN MAX+1 printf(STRLEN=%d\n,STRLEN); #undef MAX #define MAX 200 printf(NEW MAX=%d\n,MAX); printf(STRLEN=%d\n,STRLEN); } 程序运行结果: MAX=100 STRLEN=101 NEW MAX=200 STRLEN=201 在进行宏定义时,可以引用已定义的宏名,层层替换 #define M 3 #define N M+1 #define s N*N/2 main() {printf(s=%d\n,s); printf(5*s=%d\n,5*s); } 对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 如:上例中的printf(“5*s=%d\n”,5*s);引号内的s是字符而不是宏名,因此不做置换 注意,展开为M+1*M+1/2 不是(M+1)*(M+1)/2 程序输出结果为: 6 5*s=18 格式:# define 宏名(参数表) 字符串 作用:按#define命令行中指定的字符串从 左到右进行置换,不仅进行简单的字 符串替换,还要进行参数替换。 带参数的宏定义 宏定义是用宏名代替一个字符串,只作简单的置换,不作语法检查。 # define s(r1,r2) r1*r2 main() { int a=2,b=4,c; c=s(a+b,a*b); printf(c=%d\n,c); } 注意,展开为a+b*a*b 不是(a+b)*(a*b) 程序输出结果为: 34 #define squ(n) n*n void main (void) { printf ("%f\n",27.0/squ(3.0)); } 注意,展开为27.0/3.0*3.0 不是27.0/(3.0*3.0) 程序输出结果为: 27.000000 在宏定义时,宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。 # define S (r) PI*r*r 则认为符号常量S代表字符串“(r) PI*r*r” 函数与带参数的宏定义的主要区别: (1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带参数的宏只是进行简单的字符替换。 (2)函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开是在编译时进行的,在展开时并不分配内存单元,不进行值的传递功能,也没有“返回值”的概念。 (3)对函数中的实参和形参都要定义类型,二者的类型要求一致。而宏不存在类型的问题,宏名无类型,它的参数也无类型。宏定义时,字符串可以是任何类型的数据。 (4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档