Effective C++:条款02:尽量以const,enum,inline替换#define
2014-06-05 12:00
471 查看
(一)类似于
[align=left]
的东西也许从未被编译器看见,在编译器开始处理源码之前也许就被预处理器移走了。ASPECT_PATIO没有进入记号表。如果该定义出现在不是本人写的头文件中,出现错误的话,编译器提示的错误信息也许提到:1.653,而不是ASPECT_PATIO。
解决方法:
[align=left]
这样的话,AspectRatio就肯定会被编译器看到,就肯定能进入记号表了!
(二)
[align=left]
往往比
[align=left]
要好
(三)
(1)
这种只声明不定义的方式是可以的,这是个特例:它是class专属常量又是static且为整数类型(ints, chars, bools),只要不取他们的地址,就可以像上面那样只声明不定义。
(2)如果我们要取该常量的地址,或者编译器坚持要看到它的定义式而报错的时候,那我们就必须提供定义式:
const int GamePlayer::NumTurns;该式子放进实现文件而不是头文件,因为NumTurns在声明的时候已经获得初值,所以现在定义的时候就不用再给初值了。
(3)旧式编译器不支持上述语法,如果我们编译器不支持static成员在声明式上获得初值的话,就这样改:
(4)如果class编译的时候需要这个常量值,像下面这种情况!,这样的话,就不能用上面那种方法了,就必须用下面这种方法:
所以尽量用第四种方法!
(四)
取一个const的地址是合法的,但是取一个enum或者#define的地址就不合法了。
(五)写一个类似于函数的#define的话,一定要多用小括号!
[align=left]
但是就算加了小括号也会出错:
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”。
所以用template inline函数代替:
请记住:
(1)对于单纯变量,最好以const对象或enums替换#define。
(2)对于形似函数的宏,最好改用inline函数替换#define。
[align=left]
#define ASPECT_PATIO 1.653[/align]
的东西也许从未被编译器看见,在编译器开始处理源码之前也许就被预处理器移走了。ASPECT_PATIO没有进入记号表。如果该定义出现在不是本人写的头文件中,出现错误的话,编译器提示的错误信息也许提到:1.653,而不是ASPECT_PATIO。
解决方法:
[align=left]
const double AspectRatio = 1.653;[/align]
这样的话,AspectRatio就肯定会被编译器看到,就肯定能进入记号表了!
(二)
[align=left]
const string authorName("Scott Meyers");[/align]
往往比
[align=left]
const char* const authorName = "Scott Meyers";[/align]
要好
(三)
(1)
class GamePlayer { private: static const int NumTurns = 5; //常量声明式 int scores[NumTurns]; //使用该常量 };
这种只声明不定义的方式是可以的,这是个特例:它是class专属常量又是static且为整数类型(ints, chars, bools),只要不取他们的地址,就可以像上面那样只声明不定义。
(2)如果我们要取该常量的地址,或者编译器坚持要看到它的定义式而报错的时候,那我们就必须提供定义式:
const int GamePlayer::NumTurns;该式子放进实现文件而不是头文件,因为NumTurns在声明的时候已经获得初值,所以现在定义的时候就不用再给初值了。
(3)旧式编译器不支持上述语法,如果我们编译器不支持static成员在声明式上获得初值的话,就这样改:
class CostEstimate { private: static const double FudgeFactor; //static常量声明 ... //位于头文件内 }; const double CostEstimate::FudgeFactor = 1.35; //static常量定义,位于实现文件内
(4)如果class编译的时候需要这个常量值,像下面这种情况!,这样的话,就不能用上面那种方法了,就必须用下面这种方法:
class GamePlayer { private: enum { NumTurns = 5 }; int scores[NumTurns]; };
所以尽量用第四种方法!
(四)
取一个const的地址是合法的,但是取一个enum或者#define的地址就不合法了。
(五)写一个类似于函数的#define的话,一定要多用小括号!
[align=left]
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))[/align]
但是就算加了小括号也会出错:
int a = 5, b = 0; CALL_WITH_MAX(++a, b); CALL_WITH_MAX(++a, b+10);
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”。
所以用template inline函数代替:
template<typename T> inline coid callWithMax(const T& a, const T& b) { f(a > b ? a : b); }
请记住:
(1)对于单纯变量,最好以const对象或enums替换#define。
(2)对于形似函数的宏,最好改用inline函数替换#define。
相关文章推荐
- [Effective C++]条款02 尽量以const,enum,inline替换#define
- Effective C++--条款02:尽量以const,enum,inline替换#define(以编译器替换预处理器)
- Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
- 读书笔记《Effective C++》条款02:尽量以const,enum,inline替换#define
- 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define
- Effective C++_笔记_条款02_尽量以const、enum、inline替换#define
- Effective C++ -----条款02:尽量以const, enum, inline替换 #define
- Effective C++ 条款02 尽量以const,enum,inline替换#define
- 《Effective C++》条款02:尽量以const,enum,inline替换#define
- [Effective C++]条款02:尽量以const,enum,inline 替换#define
- 《Effective C++》学习笔记条款02 尽量以const,enum,inline替换#define
- Effective C++ 条款02解读: 尽量以const, enum, inline替换#define
- 条款02 尽量以const ,enum,inline替换#define
- [Effective C++读书笔记]002_条款02_尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- 条款02:尽量以const, enum, inline 替换#define
- 《effective c++》条款二:尽量以enum,const,inline替换#define
- 读书笔记《Effective c++》 条款02 尽量用const,enum,inline代替#define