宏定义

本文详细介绍了C语言中的宏定义,包括宏定义的解析规则、带参宏的使用,以及宏与函数的区别。强调了宏定义时参数加括号的重要性,指出宏定义在预处理阶段展开,而函数在编译期间处理。还提到了宏定义在DEBUG和RELEASE版本中的作用,并指出宏定义不检查类型,可能导致运行时错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:宏的规则和使用

@1:宏定义的解析规则:预处理阶段由预处理器进行替换,这个替换是原封不动的替换。

@2:宏定义的组成   :第一部分是 #define ,第二部分是宏名,剩下的所有为第三部分。

@3:带参宏   : 带参宏的使用和带参函数非常像,但是使用上有一些差异。

在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可。


2:宏的使用

@1:宏定义示例1:MAX宏,求2个数中较大的一个#define MAX(a, b) (((a)>(b)) ? (a) :(b))

关键点注意: 注意参数加括号, 运算符

@2:宏定义示例2:SEC_PER_YEAR,用宏定义表示一年中有多少秒 #define SEC_PER_YEAR   (365*24*60*60 UL)

错误方法:#define SEC_PER_YEAR(365*24*60*60) // 宏定义默认int类型,超过类型存储范围了

#define SEC_PER_YEAR(365*24*60*60)UL // 实际测试 gcc 中编译错误

关键点 UL表示 表示16进制 长整型 ( 不确定, ) 。 或者表示无符号长整型


3:带参宏和带参函数

@区别1: 宏定义是在预处理期间处理的,而函数是在编译期间处理的。

调用宏时,原地展开宏。调用函数时要跳转到函数内部执行函数,执行结束后再跳转回来。

相对来说,调用函数较为复杂,占用资源较多。调用宏的优势在于没有传参。

因此函数较短的情况下,使用宏定义代替可以提高效率。

@区别2:宏定义不会分辨类型(没有类型)。函数既有参数类型,也有返回值类型。

函数的时候程序员不太用操心类型不匹配因为编译器会检查,如果不匹配编译器会叫

的时候程序员必须很注意实际传参和宏所希望的参数类型一致,否则可能编译不报错但是运行有误

4: 宏定义和程序的 debug 版本,与release 版本有关系。

程序有DEBUG版本和RELEASE版本,区别就是编译时有无定义DEBUG宏。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值