预处理命令

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;
}

函数就不同了,函数还需要分配栈空间,在执行函数时都要进行入栈和出栈操作,有的还需要分配堆空间。

宏所实现的功能有限,而且长代码不易读,但是对于逻辑简单、代码不长、经常使用的功能由宏来实现是个不错的选择





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值