宏定义的相关知识

1、概念

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
(1)   简单的宏定义:
 #define   <宏名>  <字符串> 

 例:   #define PI 3.1415926

(2) 带参数的宏定义 
 #define   <宏名> (<参数表>)   <宏体>

注意:

? 该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。

? 宏名定义后,即可成为其它宏名定义中的一部分。

? 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如: #define XYZ

this is a test,使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识

别出的是"XYZ"

? 如果串长于一行,可以在该行末尾用一反斜杠' \'续行。


2、常见问题总结

为了能清楚的理解问题,首先说一下C语言的编译过程。c语言的编译经过预处理、编译、汇编、连接,而宏定义在预处理阶段生成,此过程只是纯粹的替换和展开没有任何计算(这个是关键)。

(1)下面一段带来,请写出其输出其结果

 #define   N   3+3
 void main()
 {
   int   temp = N*N;
   printf(“%d”,temp);
 }

分析:展开是在预处理阶段完成的,这个阶段把替换文本只是看作一个字符串,并不会有任何的计算发生,在展开时是在宏N出现的地方 只是简单地使用串3+3来代替N,并不会增添任何的符号,所以对该程序展开后的结果是temp =3+3*3+3,计算后=15,这就是宏替换的实质

(2)带参数的宏定义

#define   area(x)   x*x
void main()
{
int   y=area(2+2);
printf(“%d”,y);
}
按理说给的参数是2+2,所得的结果应该为4*4=16,但是错了,因为该程序的实际结果为8,仍然是没能遵循纯粹的简单替换的规则,又是先计算再替换 了,在这道程序里,2+2即为area宏中的参数,应该由它来替换宏定义中的x,即替换成2+2*2+2=8了

(3) 关于#和##

形式参数不能用带引号的字符串替换。
但是,如果在替换文本中,参数名以#作为前缀则结果将被扩展为 由 实际参数 替换 此实际参数的带引号的字符串。
例如,可以将它与字符串连接运算结合起来编写一个调试打印宏:
#define dprint(expr) printf(#expr “ = %\n”,expr)
使用语句 dprint(x/y);
调用宏时,该宏将被扩展为:printf(“x/y”“ = %\n”,x/y);
其中的字符串被连接起来了,这样便等价于printf(“x/y = %\n”,x/y);

在实际参数中,每个双引号 “ 将被替换为 \” ;反斜杠\将被替换为\\,因此替换后的字符串是合法的字符串常量。

预处理运算符 ## 为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与 ## 相邻,则该参数将被实际参数替换,##与前后的空白符将被删除,并对替换后的结果重新扫描。
例如,下面定义的宏paste用于连接两个参数
#define paste(front, back) front ## back
因此,宏调用past(name,1)的结果将建立记号name1.


c语言中没有swap这个函数,C语言不支持重载,也没有模版的概念,所以对于每一种类型,都要写出相应的swap,如
intSwap   (int   *,   int   *);  
longSwap   (long   *,   long   *);  
stringSwap   (char   *,   char   *); 

得到指定地址上的一个字节或字

#define  MEM_B( x )  ( *( (byte *) (x) ) )

#define  MEM_W( x )  ( *( (word *) (x) ) )

求最大值和最小值

#define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

#define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )


宏定义swap(t,x,y)以交换t类型的两个参数(要使用程序块结构)。
程序如下:
#include <iostream.h>

#define SWAP(t,x,y) \
{\
t temp = *y;\
*y = *x;\
*x = temp;\
}

main()
{
int a = 10, b = 5;
SWAP(int,&a,&b)
cout << a << endl << b<<endl;
}
用\换行,\的意思是說把下一行看作和這行是同一行.換行必須要反斜杠,而且\後面直接回車,不能有空格。宏定义需写在一行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值