C语言预处理指令 #define
#define基础知识
- #define 指令的作用是实现 “宏替换”,在正式编译前执行规定的替换操作,只做替换,不做运算。
- #define指令由3部分组成
指令本身: #define
宏: 即指定的要被替换的符号
替换体:代替宏的具体内容
如 #define MAX_COUNT 100
MAX_COUNT为宏,100为替换体。 - 宏 需要遵循C变量命名规则,不能包含空格,最好大写。
#define的使用
替换明示常量
#define 可以起到对常量起别名的作用,增强可读性和可维护性。
#include<stdio.h>
#define YEAR 2023
#define MY_COUNTRY "中国"
#define PAINT_SEPARATOR printf("----------------------\n") /*打印分隔符语句*/
int main()
{
printf("%d\n",YEAR); /* == printf("%d",2023)*/
PAINT_SEPARATOR;/* == printf("----------------------\n")*/
printf(MY_COUNTRY); /* == printf("中国")*/
return 0;
}
运行结果
注意:#define在替换体较长时,可以使用 \ 反斜杠进行换行,在IDEA中编写程序时,不可以直接对长替换体进行换行,必须使用 \ 示意换行,否则编译器会认为换行前预编译指令已经结束。
#define LONG_SENTENCE "123456789123456789\
123456789"
printf(LONG_SENTENCE)结果为:123456789123456789123456789
注意:如果写成 printf(“MY_COUNTRY”),打印结果为:MY_COUNTRY
即,宏替换时不会将双引号内的宏替换掉
#define中使用参数,充当函数
带参数的宏类似于函数,用括号将参数包括起来,称为类函数宏。类函数宏中的圆括号中可以有一个或多个参数。
如 #define ADD(X,Y) X+Y
#include<stdio.h>
#define ADD(X,Y) X+Y
#define SQUARE(X) X*X
#define PT(X) printf("The result is %d\n",X)
int main()
{
int a = ADD(1,2);
printf("ADD(1,2)\t");
PT(a);
int b = SQUARE(5);
printf("SQUARE(5)\t");
PT(b);
int c = SQUARE(2+3);
printf("SQUARE(2+3)\t");
PT(c);
return 0;
}
运行结果如下:
注意到SQUARE(2+3)的结果是 11,这是计算 2+3*2+3 式子的结果,原因回到开局那句话,宏替换只做替换不做运算。
鉴于上述定义SQUARE(X)方法可能因为运算优先级问题导致结果不符合预期,所以建议在定义替换体内容时,要多使用括号保证运算的顺序可靠。
#define SQUARE(X) X*X
应该改为 #define SQUARE(X) (X) * (X)
这样就不会产生歧义。
**注:**使用宏来代替函数,其效果相当于内联函数,在程序中生成语句,这是一种空间换时间的操作。在某函数可能被循环调用多次时,可以考虑将该函数定义为宏。