【C】高级宏定义
宏定义的实质
- 宏定义实质:只替换,不计算。
C语言三大预处理功能
- 宏定义
- 文件包含
- 条件编译
不带参数的宏定义
宏定义分为带参数和不带参数两种情况,不带参数的情况就是我们熟悉的直接替换操作。
例如:
#define PI 3.14
这个宏定义的作用是把程序中出现的 PI 在预处理阶段全部替换成 3.14。
注意:
-
为了和普通的变量进行区分,宏的名字通常我们约定是全部由大写字母组成
-
宏定义只是简单地进行替换,并且由于预处理是在编译之前进行,而编译工作的任务之一就是语法检查,所以编译器不会对宏定义进行语法检查
-
宏定义不是说明或语句,在末尾不必加分号
-
宏定义的作用域是从定义的位置开始到整个程序结束
-
可以用
#undef来终止宏定义的作用域 -
宏定义允许被嵌套
#include<stdio.h> #define PI 3.14 #define R 6371 #define V PI * R * R * R * 4 / 3 int main(void) { printf("地球的体积大概是 : %.2f\n",V); return 0; }运行结果
地球的体积大概是 : 1082657777102.05
带参数的宏定义
C 语言允许宏定义带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。
例如:
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
这个宏定义的作用是求出 x 和 y 两个参数中比较大的那一个
#include<stdio.h>
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
int main(void)
{
int x, y;
printf("请输入两个整数(用空格隔开) : ");
scanf("%d%d",&x,&y);
printf("%d 是较大的那个数! \n",MAX(x,y));
return 0;
}
运行结果
请输入两个整数 : 3 5
5 是较大的那个数!
注意:
-
使用带参数的宏定义时要注意空格问题,宏名和参数之间不能有空格,像下面这种语法是错误的!
#define MAX (x, y) (((x) > (y)) ? (x) : (y)) -
因为宏定义本身进行的是机械替换,所以带参数的宏定义还需要注意括号问题
#include<stdio.h> #define SQUARE(x) x*x int main(void) { int x; printf("请输入一个整数 : "); scanf("%d",&x); printf("%d 的平方是 : %d\n",x, SQUARE(x)); printf("%d 的平方是 : %d\n",x+1, SQUARE(x+1)); //SQUARE(x+1) => x+1*x+1 => 5+1*5+1 return 0; }运行结果
请输入一个整数 : 5 5 的平方是 : 25 6 的平方是 : 11

浙公网安备 33010602011771号