条款02:尽量以const,enum,inline替换 #define

条款核心:宁可以编译器替换预处理器。

#define ASPECT _RATIO 1.653 

 ASPECT _RATIO也许从未被编译器看见,在预处理阶段它就被预处理器移走了,所以ASPECT_RATIO有可能没进入记号表。

解决之道是以一个常量替换上述的宏(#define)

const double AspectRatio = 1.653;

因为预处理器阶段只是盲目的替换,可能会导致代码重复,改为常量就不会出现这种情况,而且常量在记号表中。

class 专属常量。为了将常量的作用域(scope)限制于class内,你必须让它成为一个class的一个成员(member);而为确保此常量至多只有一份实体,你必须让它成为一个static成员。

class GamePlayer
{
    private:
        static const int NumTurns = 5;        //常量声明式
        int scores[NumTurns];                 //使用该常量 
};

NumTurns是一个声明式而非定义式。C++对static的专属整数型常量有着特别的处理。只要不取它们的地址,或者编译器要求坚持看到一个定义式(不正确的)。你就必须另外提供一个定义式:

const int GamePlayer::NumTurns;

把这个放进实现文件而不是头文件,由于class常量在声明时获得初值,因此定义时不可以在设置初值。

GamePlaye也可用枚举定义,当你的编译器不予许“static 整数型class常量”完成“in class 初值设定”,可改用所谓的“the enum hack”补偿做法。其理论基础是:“一个枚举类型的数值可权充ints被使用”。

class GamePlayer
{
     private:
        enum{NumTurns = 5};
        int scores[NumTurns]; 
};

取一个const的地址合法,但取enum和#define不合法。

 

总结:

  对于单纯变量,最好以const对象或enums替换#define

  对于形似函数的宏。最好改用inline函数替换#define

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值