浅析C语言中宏定义使用.docVIP

  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文档。上传文档
查看更多
浅析C语言中宏定义使用

浅析C语言中宏定义使用   [摘要]宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名。给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法,但是使用不慎会得到意外的结果。   [关键词]预处理 宏定义 宏名 宏展开   中图分类号:TP3 文献标识码:B 文章编号:1002-6908(2007)0820040-01      宏是C语言中常用的编译预处理功能之一。在编程时,可以使用宏来代替一些常量或表达式,给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率。另外,在C语言中,宏是产生内嵌代码的唯一方法,并且可以定义带参数的宏,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。但是如果对宏命令本质理解不透彻,在使用时可能运行的结果与预期的结果就会大相径庭。下面具体介绍C语言中宏的使用(即宏定义、宏调用、宏展开)。      一、宏定义      在C语言源程序中,允许用一个标识符表示一个字符串,称为“宏”;被定义为宏的标识符称为“宏名”。   宏定义是由源程序中的宏定义命令完成的。该命令有两种形式:一种是无参数的宏定义;另外一种是带参数的宏定义。      (一)无参数的宏定义   无参数宏的宏名后不带参数。其定义的一般形式为:   #define标识符字符串   #是预处理命令的标志,define是宏定义命令的标志。标识符为宏名,字符串可以是常量、表达式、格式串等。   例如:#definePI3.1415926   #defineSUM (1+2)      (二)带参数的宏定义   带参数的宏定义,也称为宏函数,在宏定义中的参数称为形式参数,形式参数不分配内存单元,所以不必作类型定义。带参数的宏定义的一般形式如下:   #define宏名(参数表)宏体   例如:#defineAREAR(R)3.14*R*R    #define SUM(X,Y) X+Y   两种格式的宏定义必须写在函数的外边,其作用域为宏定义命令起到源程序结束,若要终止其作用域可以用#undef命令加宏名,宏定义也允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。      二、宏展开及宏调用      (一)宏展开及调用的概念   编译预处理时程序中出现的所有宏名都要有宏定义中的字符串来代换,称为宏展开。嵌套的宏定义,展开时要层层展开。程序中字符串内的字符跟宏名相同时作为一般字符处理,不用宏展开。对于带参数的宏的使用称为宏调用,一般形式为:宏名(实参表);在调用中,不仅要宏展开,而且要用实参去代换形参。   C语言源程序的处理过程,经历了编辑、预处理、编译、连接几个过程。其中预处理产生编译的输入,源文件中若有宏命令,则预处理器将其展开成相应的宏定义,这个阶段的工作只是纯粹的替换展开,没进行任何的计算。同时现有的编译系统没有提供独立的预处理系统进行预处理,所以我们看不到预处理后的代码,在编译时可能会出现错误,但是系统检测不出来。所以在宏展开时我们一定要谨慎。      (二)宏展开及调用的应用实例   1.无参宏的定义实例   例题1:求圆的周长及面积。   源程序:   #definePI3.14159   main()   {float r,c,s;   scanf(“%f”,r);   c=2*PI*r;   s=PI*r*r;   printf(“周长为:%f,面积为:%f”,c,s);}   本题中的PI为宏名,在程序中出现宏名的地方直接用字符串3.14159代替即可得宏展开后的程序,并能计算出结果。   例题2:源程序:   #defineN2+1    main()    {int a;   a=N*N;   Printf( % d,a); }   本题中宏名N代表的是表达式2+1,使用时容易产生的错误是先把N计算出来2+1=3,然后再带入求a的值,a=3*3,结果为9。但实际上宏展开只是简单的代替,不进行计算,本题应该这样计算a=2+1*2+1,得到结果为5。   2.带参宏的定义实例。   例题3:源程序:   #define f(x)(x*x)   main()   {inti1, i2;   i1=f(8)/f(4);   i2=f(4+4)/f(2+2);   Printf(%d,%d,i1,i2);}   本题的输出结果是4,3。i1,i2看上去参数一样为什么结果不同呢,实际上二者的调用、展开形式不同,其中i1=(8*8)/(4*4)=64/16

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档