Romi-知行合一

轻轻的风轻轻的梦,轻轻的晨晨昏昏, 淡淡的云淡淡的泪,淡淡的年年岁岁。
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

C语言预处理——宏定义

Posted on 2012-08-05 16:35  romi  阅读(1695)  评论(0编辑  收藏  举报

当对一个源文件进行编译时,系统将自动调用预处理程序对文件中与处理部分进行处理,完成后才进入对源程序的编译。

所谓宏定义,是使用一个标识符来表示一个字符串。宏有两种,一种是不带参数的宏,一种是带参数的宏,如下所示:

不带参数:#define PI 3.14159

带参数:#define MAX(a,b) (a>b)?a:b

不带参数比较容易理解,带参数的宏需要注意以下几点:

①宏定义中的形式参数指示标志符,不分配内存空间,宏调用过程也只是符号替换,不存在值的传递。

②宏名和形式参数之间不能加空格,否则会被认为是无参数的宏定义。

例如 #define MAX (a,b) (a>b)?a:b,该语句的宏调用语句变为了:max=(a,b)(a>b)?a:b,显然不正确。

③宏定义中字符串内的形式参数和整个字符串最好都用括号括起来,以便面调用时出错。下面详细说明。

看下面简单程序

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define MUL(a,b) a*b
 5 int main()
 6 {
 7     int k=MUL(2+3,4);
 8     printf("k=%d",k);
 9     return 0;
10 }

输出结果为14,这样结果的原因是调用MUL后宏展开形式为2+3*4。所以要得出正确结果,必须将a和b都用括号扩上,将宏定义改成下面这样

#define MUL(a,b) (a)*(b)

再看结果就是20了,但这样是否就可以了。看下面的例子

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define MUL(a,b) (a)*(b)
 5 int main()
 6 {
 7     float k=10/MUL(2,5);
 8     printf("k=%f",k);
 9     return 0;
10 }

结果是25,这是怎么回事呢,原因是展开宏后就是k=10/2*5,所以不仅要将宏定义中单个变量用括号括起来,运算式子也要用括号括起来,如下:

#define MUL(a,b) ((a)*(b))

这样结果就是1了。