您的位置:首页 > 编程语言 > C语言/C++

C语言预处理——宏定义

2012-08-05 16:35 169 查看
当对一个源文件进行编译时,系统将自动调用预处理程序对文件中与处理部分进行处理,完成后才进入对源程序的编译。

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

不带参数:#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,显然不正确。

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

看下面简单程序

#include <stdio.h>
#include <stdlib.h>

#define MUL(a,b) a*b
int main()
{
int k=MUL(2+3,4);
printf("k=%d",k);
return 0;
}


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

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

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

#include <stdio.h>
#include <stdlib.h>

#define MUL(a,b) (a)*(b)
int main()
{
float k=10/MUL(2,5);
printf("k=%f",k);
return 0;
}


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

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

这样结果就是1了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: