1.1 宏定义
C语言标允许在程序中用一个标识来表示一个字符串,称为宏。标识符为宏名,在编译预处理时,将程序中所有的宏名用相应的字符串来替代,这个过程称为宏替换,宏分为无参数的宏和有参数的宏。
【例1】使用无参数宏的程序,输入半径,求圆的周长、面积、和体积。
1 #include <stdio.h>
2 #define PI 3.1415926
3 main()
4 {
5 float 1,s,r,v;
6 printf("input radius:");
7 scanf("%f",&r);
8 1=2.0*PI*r;
9 s=PI*r*r;
10 v=4.0/3.0*PI*r*r*r;
11 printf("1=%10.4f\ns=%10.4f\nv=%10.4f\n",1,s,v);
12 }
【例2】输入格式为宏的示例。
1 #define PRprintf
2 #define NL"\n"
3 #define MACRO "%d"
4 #define MACRO1 NL
5 #define MACRO2 MACRO NL
6 #define MACRO3 MACRO MACRO NL
7 #define MACRO4 MACRO MACRO MACRO NL
8 #define S"%s\n"
9 main()
10 {
11 int a,b,c,d;
12 char string[]="CHINA";
13 A=1;B=2;C=3;D=4;
14 PR(MACRO1,a);
15 PR(MACRO2,a,b);
16 PR(MACRO3,a,b,c);
17 PR(MACRO4,a,b,c,d);
18 PR(s,string);
19 }
2.有参数宏
类似于有参数的函数,其定义的一般形式为:
#define MAX(x,y) (x>y? X:y)
main()
{
int a=1,b=2,max;
max=MAX(a,b);
printf{"the max between(%d,%d)is%d\n",a,b,max}
}
程序说明:
#define M(x,y) x*y
在程序中有:
int a=2,b=3,c;
c=M(a+1,b+1);
那么进行宏替换,a+1是x的实参,b+1是y的实参,那么替换后的结果为:
c=a+1*b+1;
显然这是不符合要求的,应该按照如下方式进行宏定义:
#define M(x,y)(x)*(y)
此时的宏展开后:
c=(a=1)*(b+1);
定义有参数的宏的时候,应该注意。
(1)宏名与形参的圆括号之间不能有空格,否则会导致错误。例如#define M(x,y)(x)*( y ),M与“(”之间不能有空格。
(2)在宏定义中,字符串内的形式参数最好用括号括起来,以免错误。例如,#defineM(x,y)(x)(y)、x、y都用括号括起来。
宏定义与函数的区别
宏只是字符的替换,在预处理阶段就给替换到代码中去了比如下面的代码 #include<stdio.h> #define MAX(x, y) ((x)>(y)?(x):y()) int main() { int a = 2, b = 4; int m; m = MAX(2, 4); printf("%d\n", m); return 0; } 如果你用的是gcc编译器,执行 gcc -E main.c -o main.i,打开main.i文件就可以看到他是如何替换进去的,直接拖到最后,前面的都是stdio.h中的内容。 int main() { int a = 2, b = 4; int m; m = ((2)>(4)?(2):4()); printf("%d\n", m); return 0; } 函数就不同了,函数还需要分配栈空间,在执行函数时都要进行入栈和出栈操作,有的还需要分配堆空间。 宏所实现的功能有限,而且长代码不易读,但是对于逻辑简单、代码不长、经常使用的功能由宏来实现是个不错的选择