条款02:尽量以const, enum, inline 替换 #define 【读书笔记 Effective C++】

 

#define ASPECT_RATIO 1.653

 

 

基础知识:

(1)宏定义#define NAME Value 是预处理器处理,编译器无法看到NAME,没有进入记号表(symbol table)中。

 

存在问题:

(1)当运用该常量获得一个编译错误信息时,由于ASPECT_RATIO不在symbol table中,那么编译错误提示1.653而不是ASPECT_RATIO。如果ASPECT_RATIO被定义在一个非你写的头文件内,你将为追踪它而花费时间。

(2)产生过多的目标代码(object code),因为预处理器会将所有ASPECT_RATIO都替换为1.653

(3)宏函数虽然简便,不会导致函数调用带来的开销,但容易误用

 

解决方法:

(1)使用常量替换宏

const double AspectRatio = 1.653

 

(2)对于class 专属常量,为了将常量的作用域限定在class内,那么它既要是class的一个成员,又要保证此常量至多只有一份实体,可以使用静态成员:

static const int Count = 5;

或:

enum {Count = 5};

 

(3)对于宏函数,使用inline函数替换

#define CALL_WITH_MAX(a., b) f((a) > (b) ? (a) : (b))

替换为

template<typename T>

inline void callWithMax(const T&a, const T&b)

{

    f(a > b ? a : b);

}

这样做的好处:

a. 不需要考虑为函数参数加上过多的括号

b. 不用担心参数被计算多次(如宏函数中a++)

c. 可以控制作用域和访问规则(比如该函数可以是class 成员函数)

 

注意:

对于字符串常量一般写为

const string authorName("Scott Meyers");

而不写成(避免多个const)

const char *const authorName = "Scott Meyers";

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章