宏定义的作用是替换,再复杂也只能替换,不能用做计算;
一个源文件将另一个源文件的全部内容包含进来;
条件编译;
不带参数的宏定义:
#include <stdio.h>
#define PI 3.14
int main()
{
printf("%f", PI);
}
把程序中出现的PI在预处理时全部替换成3.14;
宏的名字用大写字母组成,宏定义末尾不需要加分号;
#include <stdio.h>
#define PI 3.14
int main()
{
#undef PI
printf("%f", PI);
}
宏定义的作用范围从定义的位置开始,到整个程序结束。也可以用#undef终止宏定义的作用域;
#include <stdio.h>
#define STR1 "Hello"
#define STR2 "World"
#define STR3 STR1 STR2
int main()
{
printf("%s\n", STR3);
}
#include <stdio.h>
#define X 30
#define SQU (X * X)
int main()
{
printf("%d\n", SQU);
}
宏定义的嵌套,一个宏中使用另外一个宏;
带参的宏定义,宏定义中的参数是形参,宏调用时的参数是实参,和函数类似;
#include <stdio.h>
#define MAX(x, y) (((x)>(y))?(x):(y))
int main()
{
int a = 10;
int b = 20;
int c = MAX(a, b);
printf("%d", c);
}
#include <stdio.h>
#define SQU(X) (X * X)
int main()
{
printf("%d\n",SQU(3));
printf("%d\n", SQU(3 + 1));
}
SQU(3) = (3 * 3)
SQU(3 + 1) = (3 + 1 * 3 + 1)
宏定义只能做简单的替换;
#include <stdio.h>
#define SQU(X) ((X) * (X))
int main()
{
printf("%d\n",SQU(3));
printf("%d\n", SQU(3 + 1));
}
SQU(3 + 1) = ((3 + 1) * (3 + 1))
在宏定义时,加上小括号就不容易出错;
尽量不要用宏定义代替函数或表达式;