条款2:尽量以const,enum,inline 替换 #def

2018-11-19  本文已影响0人  庄阿莫

>>One

问题情景

当你使用一个宏(#define ASPECT_RATIO 1.653)作为报错信息时,你会得到1.653而不是 "ASPECT_RATIO" 这个报错信息而苦恼。这是由于 #define 不被视为语言的一部分,“ASPECT_RATIO”未进入记号表所导致的。

怎么做

以常量替换上述的宏:
const double Error_AspectRatio = 1.653;

为什么这么做

注意

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

如果你要取GamePlayer::NumTurns的地址,编译器又需要看到一个定义式,你必须提供给它:
(由于它在声明时获得初值,因此不需要在定义时赋值)
const int GamePlayer::NumTurns;

>>Two

问题情景

上述代码中,如果编译器不允许在类内初始化 static成员变量。

怎么做

//示例一
class GamePlayer {
private:
    static const int NumTurns;//头文件内
    ...
};
const int GamePlayer::NumTurns = 5;//实现文件内

或者

//示例二
class GamePlayer {
private:
    enum { NumTurns = 5 };

    int scores[NumTurns];
}

为什么这么做

  1. 对于示例二

>>Three

问题情景

#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
在你被 #define 所导致的可读性问题困扰时,inline-template会帮助你。

怎么做

template<typename T>
inline void callWithMax( const T& a, const T& b )
{
    f( a > b ? a : b )
}

为什么这么做

上一篇下一篇

猜你喜欢

热点阅读