Effective C++之二

本文探讨了在C++中避免使用#define的原因及其替代方案。通过使用const变量和内联函数模板,可以提升代码的安全性和封装性。此外,文章还讨论了预编译器的合理使用场景。

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

     第二条的内容记忆得就不如第一条丰富了,:-)

     核心思想:不要使用#define!

     一般的,#define有两个用途:1. 定义常量,2.定义常用操作,例如max(a,b)。

   #define用途一的替代方案是:const变量。好处一是:宏定义是预编译处理的,只是做简单的文本替换,宏定义token不在编译符号表支持,而const能在编译期检查类型。好处二是,C++可以定义类的cosnt变量,进一步提高封装性[1]。

   #define用途二的替代方案是:内联函数模板(inline template function),其中inline不牺牲效率,template以类型安全的方式实现函数的通用性。

   [1]是展开说明的语言特性。老的C++编译器对类内const需要声明并定义。为了书写方便并且兼容老编译器,可以采用类内enum定义来替代const。两者之间还有一个细微的差别,enum是无法取地址的,const是可以取地址,故enum更像#define。

   最后Meyers谈到,尽管不建议使用#define,但是预编译器还没有到退出历史舞台的地步。例如,#ifdef用于条件编译是必要的,更不用说#include了。

   结合《重构》加两条:参见8.9节的“符号常量代替魔法数”;3.2节“过长函数”坏味道,故小函数是十分有益的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值