C++ 使用#define带来的问题及解决方法(const enum inline)

本文探讨了C++中使用#define定义常量和宏可能导致的问题,并提出了使用const对象和inline函数作为替代的方法。

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

20180302 C++ 使用#define带来的问题及解决方法(const enum inline)




情况1:当使用如下定义:
#define RATE 1.66
当你运用此常量但获得一个编译错误信息时,可能会带来困惑,因为这个错误信息也许会提到1.66而不是RATE,如果RATE被定义在一个非你所写的头文件中,你肯定对1.66以及它来自何处毫无概念,于是你将因为追踪它而浪费时间,解决方法如下:
const double rate = 1.66;//大写名称通常用于宏,小写名称适用于变量,因此这里改变名称写法


情况2:#define常常错误的实现宏


eg:
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
无论何时写出这样的宏,都要为宏中的所有实参加上小括号,否则可能会在表达式中调用这个宏时 会遭遇麻烦,但即使加上小括号,也可能出错,如下:


int a = 5,b = 0;
CALL_WITH_MAX(++a,b);//a被累加两次
CALL_WITH_MAX(++a,b+10);//a被累加一次
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”(啥意思???)


用以下方法解决(template inline函数)
template<typename T>
/*由于我们不知道T是什么,
所以我们采用pass by 
reference-to-const */
inline void callWithMax(const T& a,const T& b)
{
    f(a > b ? a : b);
}


总结:1、对于单纯常量,最好以const对象或enums替换#define
2、对于形似函数的宏(macros),最好改用inline函数替换#define


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值