C语言有很多预编译关键字,如#if、#include、#else……,所有以#开头的的关键字都属于这一类,此处讨论#define关键字
#define的核心就是“替换”
如#define MAXLEN (int)20 语句,在代码中凡是遇到MAXLEN字符串都用,(int)20替换。如源代码中b = c / MAXLEN;实际在预编译阶段将会把做替换编程,b = c / 20;来编译。
如下例代码:
- #include
<stdio.h> -
- #define
MAXLEN (int)20 - #define
MAX(a,b) ((a)>(b))?(a):(b) - #define
MIN(a,b) (a<b)?a:b -
- int
main(void) - {
-
int a[MAXLEN]; -
int i,maxvalue,minvalue; -
-
srand(0x45623); -
for(i = 0; i < MAXLEN; i++) -
printf("%d ",a[i] = rand()); -
-
maxvalue =minvalue = a[0]; -
for(i = 1; i < MAXLEN; i++) -
{ -
maxvalue = MAX(maxvalue, a[i]); -
minvalue = MIN(minvalue , a[i]); -
} -
-
printf("/nMaxValue = %d/nMinValue = %d/n",maxvalue,minvalue); -
-
return 1; - }
例代码实现的是随机生成一组整形数,然后找出其中最大和最小值,最后打印出这组整形数和最大、最小值。
其中用了3个宏定义,分别定义了数组长度MAXLEN,两个数最大值计算MAX(a,b)和两个数最小值计算MIN(a,b)。
首先,说MAXLEN宏,定义了MAXLEN后,在数组定义、循环范围限定都用到了带来个方便,当某天想要把数组长度改成200、3000、50……时,只需要简单的修改MAXLEN宏定义就搞定了。还有一个功能就是解释说明作用,读代码的人看到这个宏马上就能明白这个地方是要说明数组的长度。
再来,看MAX宏,这是#define的另一个用法 宏函数,可以传递参数,但是它的核心还是替换,MAX(c,f)预编译后会成为((c)>(f))?(c):(f),当我们需要更改这个功能时,可以通过更改这个宏更改,不需要在用这个功能的地方一一修改,这样容易出错。
最后MIN宏,和MAX宏的区别是内部参数没有加小括号,这中情况可能在有些运算符优先级高低的情况下导致与编码者意图不一致的情况,如 #define MUL(a,b) a*b
总结:
1、宏的实现核心是替换;
2、宏有解释说明作用;
3、宏函数(暂且这么叫)参数传递过程中需要注意运算优先级问题;
4、修改用宏定义实现的功能时,可以只修改一处,所有地方全部修改,不必每个用到这个功能的地方都过一遍,不容易出错;
4、在一个程序中,相同功能的宏最好只有一个,避免出现多个相同功能宏;
请多指教