条款02:尽量以const,enum,inline替换#define(prefer const,enum,inline to #define)
内容:
比如你写下如下常量定义:#define MAX_BUFFER_LEN (50)
假如编译代码的时候由于MAX_BUFFER_LEN导致的编译错误时,编译的信息里面也许会提到
50这个数字而不是MAX_BUFFER_LEN,因为MAX_BUFFER_LEN有可能就没有被写入符号表(symbol
table),这就给你带来了困惑了,如果你的项目比较大,源码文件较多,你就会对50这个数字毫无
概念,不知道它来自哪里,那是你唯一的方法就是花时间去定位代码,而如果你写下:
const int MaxBufferLen = 50;
这样的语句时,如果编译出错的话,MaxBufferLen字串就会出现在你的编译信息中,因为
MaxBufferLen是被写入了符号表中的,这样就为你节省了不少时间.
这里书上提到了一个注意点就是关于class的专属常量问题,你可以这样定义一个类的常量
来保证一个类有且仅有一个此常量实体:
class GamePlayer{
private:
static const int NumTurns = 5; //常量声明式
int scores[NumTurns]; //使用该常量
...
};
这样写只要你不取该常量地址你就可以只声明而无须提供定义式地用它们了,但是有些老编
译器不支持这种写法,它要求常量必须给出定义式或者你要用到该常量的地址,那么你就必须在其
对应的实现文件(非头文件)中提供定义式:
const int GamePlayer::NumTurns;
由于该常量在声明的时候已经提供初值了,所以定义时不可以在提供初值,而老式编译器则不
支持在声明常量的时候赋初值,所以我们可以用"the enum hack"补偿法来实现:
class GamePlayer{
private:
enum { NumTurns =5};
int socores[NumTurns];
...
};
请记住:
■ 对于单纯常量最好用const,enum替代#define.
■ 对于形似函数的宏(macros),最好用inline函数代替#define.
条款02:尽量以const,enum,inline替换#define
最新推荐文章于 2023-04-13 22:54:07 发布