第七节:预编译处理.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文档。上传文档
查看更多
第七章:预编译处理 江敏 Mail2:csminjiang+CL@ 主要内容 宏替换 文件包含 条件编译 多文件组织 预处理命令 所谓预处理,在对C源程序进行编译前由编译预处理程序对预处理命令进行处理的过程。 C语言中,以“#”开头(如#include、#define)的语句统称为编译预处理命令。 预处理命令不是C语言本身的组成部分,不能被编译程序所识别,必须在编译之前先由专门的预处理程序进行转换。 这些命令必须在一行的开头以“#”开始,末尾不加分号,以区别一般的C语句。 宏定义不是C语句,不必在行末加分号。由于是简单置换,如果加了分号则会连分号一起进行置换。如: #define??PI??3.1415926; s=PI*r*r; 经过宏展开后,该语句为 s=3.1415926;*r*r; 运行C程序的步骤和方法 一、运行C程序的步骤 上机输入与编辑源程序 对源程序进行编译 与库函数连接 运行目标程序 C语言的预处理命令 宏定义: #define , #undef 文件包含: #include 7.1 .1 不带参数的宏定义 不带参数的宏定义(即符号常量定义语句) #define 宏名 替换文本 编译时编译预处理程序自动对源程序中的“宏名”用“替换文本”来替换,即宏展开 例如: #define LENGTH 300 #define PI 3.1415926 例:符号常量定义 #define pi 3.14159 #define MSG Press any key to continue …\n void main() { printf(%f\n, pi); pi=3.14; //错误,pi不是变量 printf(MSG); } 7.1.2 带参数的宏定义 一般形式: #define 宏名(参数表) 字符串 说明: “字符串”中包含“参数表”中所指定的参数。 例:带参数的宏定义示例 #define DB(x) ((x)*2) main( ) { double y; float z=10; y=DB(z); /* 等价于: y= ((z)*2); */ printf(y=%f\n,y); } 例:带参数的宏定义示例。 #define abs(x) (((x)0)?(x):(-(x))) main( ) { int a=-3,b; float c=-2.4,d; b=abs(a); d=abs(c); printf(b=%d,d=%f\n,b,d); } 例:带参数的宏定义示例。 # define MULT1(a,b) (a)*(b) # define MULT2(a,b) a*b void main() { int x=5; printf(%d\n, MULT1(x+5, 10)); //相当于输出(x+5)*(10)的值 printf(%d\n, MULT2(x+5, 10)); // 相当于输出x+5*10的值 } 区别函数和带参数的宏定义: 函数调用时,先求出实参表达式的值,再用这个值赋给形式参数;带参数的宏定义仅仅进行字符串的简单替换。 函数调用是在程序运行时分配临时内存单元;而宏展开是在编译时进行,展开时不分配内存单元,不进行值传递。 函数调用只占运行时间;宏替换只占编译时间。 宏替换后使源程序增长,函数调用不会。 宏替换需要注意的问题 #define MAX(A,B) ((A)(B)?(A):(B)) x = MAX(p+q, r+s);被替换为如下形式 x = ((p+q)(r+s)?(p+q):(r+s)); 表达式重复计算两次; 如果表达式有副作用(自加、自减等),会得到错误的结果: x = MAX(i++, j++); x = ((i++)(j++)?(i++):(j++)); 用括号来保证计算次序的正确: #define square(X) X*X Y = square(z+1); Y = z+1*z+1 = 2z+1; # undef 预处理命令 使用# undef命令来取消原有的宏定义。 # undef命令的一般形式为: # undef 宏名 #includestdio.h #define p for(i=1;i=n;i++) printf(%d\t,i);printf(\n); void main() { int i,n=5; p n=10; # undef p p } #includestdio.h #defi

文档评论(0)

187****5045 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档