#define的用法和注意事项精讲

文章介绍了C语言中的预处理指令#define,用于实现宏替换,常用于创建常量别名和简单的文本替换。示例展示了如何定义和使用#define,包括无参数和带参数的宏,以及宏替换时不进行运算的特性,强调了在定义宏时注意运算顺序以避免歧义。此外,还提到#define在某些情况下可作为内联函数的替代,提高程序效率。
摘要由CSDN通过智能技术生成

C语言预处理指令 #define

#define基础知识

  1. #define 指令的作用是实现 “宏替换”,在正式编译前执行规定的替换操作,只做替换,不做运算。
  2. #define指令由3部分组成
    指令本身: #define
    宏: 即指定的要被替换的符号
    替换体:代替宏的具体内容
    如 #define MAX_COUNT 100
    MAX_COUNT为宏,100为替换体。
  3. 宏 需要遵循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)
这样就不会产生歧义。

**注:**使用宏来代替函数,其效果相当于内联函数,在程序中生成语句,这是一种空间换时间的操作。在某函数可能被循环调用多次时,可以考虑将该函数定义为宏。

#define还有一些其它用法,但本人不常用,暂且不写啦。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值