中南大学论坛

 找回密码
 注册(开放注册)
搜索
查看: 2286|回复: 0

[计算机类] 不带参数的宏在使用过程中的注意事项!

[复制链接]
发表于 2006-10-28 10:05:30 | 显示全部楼层 |阅读模式
宏的定义形式为: #define 宏名 宏体

要注意以下几点:

1、书写时,#define与宏名之间、宏名与宏体之间均以(一个或多个)空格隔开,也即从宏名后的第一个非空格字符开始,直到本行结束之间的符号均作为宏体看待,看下面的例子:


  若宏替换命令行后面加了分号,则该分号将成为宏体的一部分。
   如:#define N 8;
  则宏体应该是8;(分号也包括在内!)
  这时,如果遇到语句
    for(i=0;i<N-1;i++){...}
  则宏替换后的形式为:
    for(i=0;i<8;-1;i++){...}
  该程序在编译时将无法通过,问题也很难查出来。
  切记:定义宏的时候,宏体后面千万不要加分号,除非你本来就需要在宏体中加入这个分号!


2、宏替换过程
  在进行宏替换时,要注意将宏名按定义时宏体的形式原封不动地代入表达式中,不要增加任何其他的符号(尤其是小括号!),看下面的例子:

  有如下程序
  #define N 2
  #define M N+1
  #define NUM 2*M+1
  main()
  {
   int i;
   for(i=1;i<=NUM;i++) printf("%d\n",i);
  }
  则该程序中for循环执行的次数是
  A)5  B)6  C)7  D)8

  为获得宏名NUM的替换结果,先将宏名M的宏体N+1替换进去,得到NUM的形式为:2*N+1+1,注意不能给M的宏体N+1随意加小括号,写成2*(N+1)+1,这是最容易犯的错误!!然后将N的宏体替换进去,最后得到NUM的形式为2*2+1+1,该表达式的值为6,因此上述题目的正确答案为(B)。这是2000年9月二级C中的一道选择题。
  切记:在进行宏替换时,不要随意给宏体加上小括号,除非宏定义中本身就有小括号!

3、宏体不被替换的情况

(1) 双引号中的与宏名相同的字符串将不被替换;
(2) 用户标识符中只有一部分与宏名相同的字符串将不被替换。

 如有宏定义 #define PI 3.1415926
 则:语句 printf("PI is 3.14");和 int myPI;中的"PI"均不被作为宏名而替换。

您需要登录后才可以回帖 登录 | 注册(开放注册)

本版积分规则

手机访问本页请
扫描左边二维码
         本网站声明
本网站所有内容为网友上传,若存在版权问题或是相关责任请联系站长!
站长联系QQ:7123767   myubbs.com
         站长微信:7123767
请扫描右边二维码
www.myubbs.com

小黑屋|手机版|Archiver|中南大学论坛 ( 琼ICP备10001196号-2 )

GMT+8, 2024-4-18 08:58 , Processed in 0.050645 second(s), 15 queries .

Powered by 高考信息网 X3.3

© 2001-2013 大学排名

快速回复 返回顶部 返回列表