【C++基础】——#define宏定义

博客建议尽量用const、enum、inline替换#define,让编译器替换预处理器。因为#define是预处理语句,在编译器处理源码前就被预处理器移走,可能导致信息丢失,若宏定义来自头文件,排查错误时会浪费时间,还参考了《Effective C++》第三版。

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

尽量以const, enum, inline替换 #define
也就是说宁可以编译器替换预处理器
#define不被视为语言的一部分,因为#开头就是预处理语句,当给定一个
#define ASPECT_RATIO 1.653
的时候,在编译器开始处理源码之前他就已经被预处理器移走了,所以就可能丢失了ASPECT_RATIO,当错误来自1.653的时候,但是这个宏定义又不是你自己写的,且来自于头文件,那么你可能会浪费太多没必要的时间在这个小问题上!

参考《Effective C++》,第三版

### C++ 中预处理指令 `#define` 的使用方法 #### 1. 基本定义 在C++中,`#define` 是一种预处理指令,用于定义宏。当编译器遇到这个指令时,在实际编译之前会按照指定方式替换源代码中的特定标记[^2]。 #### 2. 定义常量 可以利用 `#define` 来创建无类型的常数。例如: ```cpp #define PI 3.14159 ``` 上述代码表示每当程序里出现 `PI` 这个符号的时候都会被替换成数值 `3.14159`[^5]。 #### 3. 函数式的宏定义 除了简单的变量替代外,还支持带参数的形式来模拟函数行为。其基本形式如下所示: ```cpp #define MACRO_NAME(param1, param2) (expression involving params) ``` 这里有一个具体的例子展示如何实现两个整数相加的功能: ```cpp #define ADD(x, y) ((x)+(y)) ``` 值得注意的是为了防止运算符优先级引发错误通常会在整个表达式以及各个操作数周围加上额外的小括号以确保计算顺序正确[^4]。 #### 4. 需要注意的地方——关于空格的影响 对于 `#define` 后面紧跟的内容非常敏感,尤其是涉及到空白字符的情况。如果希望定义的结果中间含有空格,则需谨慎对待以免造成意外的行为。例如下面这段话提到过这个问题:“实际上在使用 #define 时担心空格。”[^1] 另外需要注意的一点是在多行宏定义的情况下要特别小心地处理续行符 `\`, 并且最好采用 `do...while(0)` 结构包裹复合语句从而避免某些上下文中可能出现的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值