#define定义函数

来源:互联网 发布:js的math函数 编辑:程序博客网 时间:2024/06/07 19:50
c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
  带参宏定义的一般形式为:  #define 宏名(形参表) 字符串
  在字符串中含有各个形参。 带参宏调用的一般形式为:  宏名(形参表)
  例如:
  #defineM(y)((y)*(y)+3*(y))/*宏定义*/
  k=M(5);/*宏调用*/
  在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:  k=5*5+3*5
  程序2:
  //#include<cstdio>
  #include<stdio.h>
  #define MAX(a,b)((a>b)?(a):(b))
  intmain(intargc,char*argv[])
  {
  intx,y,max;
  printf("inputtwonumbers:");
  scanf("%d%d",&x,&y);
  max=MAX(x,y);
  printf("max=%d\n",max);
  return0;
  }

  上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式 (a>b)?a:b ,形参a,b均出现在条件表达式中。程序中 max=MAX(x,y) 为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)?x:y;  用于计算x,y中的大数。
  #define 条件编译

  头文件(.h)可以被头文件或C文件包含;重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含(重复定义)


#define Abs(x) (x>=0 ? x:(-x))宏定义只是完全替换,不会自动给你加括号的Abs(a-b)变成Abs(a-b) (a-b>=0 ? a-b:(-a-b))-a-b 就出现问题了,负号的优先级比减号高的所以在宏定义里,每项运算都要加括号,因为括号的优先级最高,保证表达式的运算顺序不会发生改变#define Abs(x) ((x)>=0 ? (x):(-(x)))



2 0
原创粉丝点击