带参数的宏定义

带参数的宏定义的一般形式如下:

  #define <宏名>(<参数表>) <宏体>

  其中, <宏名>是一个标识符,<参数表>中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。<宏体>是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。例如:

   #define SUB(a,b) a-b

如果在程序中出现如下语句:

   result=SUB(2, 3)

则被替换为:

   result=2-3;

如果程序中出现如下语句:

   result= SUB(x+1, y+2);

则被替换为:

   result=x+1-y+2;

  在这样的宏替换过程中,其实只是将参数表中的参数代入到宏体的表达式中去,上述例子中,即是将表达式中的a和b分别用2和3代入。

  我们可以发现:带参的宏定义与函数类似。如果我们把宏定义时出现的参数视为形参,而在程序中引用宏定义时出现的参数视为实参。那么上例中的a和b就是形参,而2和3以及x+1和y+2都为实参。在宏替换时,就是用实参来替换<宏体>中的形参。

下面是带参数的宏定义的例子:

 带参数的宏定义 - 匠人 - 匠人的木屋 例3-4

 #include <iostream.h>

 #define SUB(a,b) a-b

 void main ()

 {

  int x,y,result;

  x=2;

  y=3;

  result=SUB(x+2,y-1);

  cout<< "result="<<result<<end1;

 }

该程序经宏替换后,main函数变为:

 void main ()

 {

  int x,y,result;

  result=x+2-y-1;

  cout<< "result="<<result<<end1;

 }

   执行该程序后,输出结果如下:

   result=0

   虽然带参数的宏定义和带参数的函数很相似,但它们还是有本质上的区别:

   (1) 在带参的宏定义中,形式参数不是变量,只是一个符号,不分配内存单元,不必定义其形式参数的类型。发生宏"调用"时,只是将实参替换形参。而在函数中,形参和实参是完全独立的变量,它们均有自己的作用域。当调用发生时,实参传递给形参的过程(值传递或引用传递)完全不同于简单的宏替换。

   (2) 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。如:

 带参数的宏定义 - 匠人 - 匠人的木屋 例3-5

 #include <iostream.h>

 #define SQ(y) (y)*(y)

 void main()

 {

  int x, result;

  cout<<"input a number: "<<endl;

  cin>>x;

  sq=SQ(x+1);

  cout<<"result="<<endl<<result;

 }

   上例中"#defint SQ(y) (y)*(y)"一行为宏定义,形参为y。程序中宏调用时实参为x+1,是一个表达式,在宏展开时,用x+1代换y,再用(y)*(y) 代换SQ,得到如下语句:"result=(a+1)*(a+1); ",这与函数的调用是不同的, 函数调用时要把实参表达式的值求出来再赋予形参。而宏代换中,对实参表达式不作计算直接地照原样替换。

 

 

  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值