effective c++ item2总结:以编译器替换预处理器
2017-08-04 09:28
148 查看
item 2:
以编译器替换预处理器(以const,enum,inline替换#define):
#define不被视为语言的一部分,那正是他的问题所在。sam1:
#define ASPECT_RATIO 1.534
替换为:
const double AspectRatio=1.534;
名称记号ASPECT_RATIO也许从未被编译器看见:可能在编译器开始处理源码之前就被预处理器移走了。作为一个语言常量,AspectRatio肯定会被编译器看到,通常还导致较少的代码量,因为预处理器“盲目将宏名称ASPECT_RATIO 替换为1.534”可能导致目标代码出现多份1.534,而const不会。
Sam2:
无法利用#define创建一个class专属常量,因为#define并不重视作用域。这意味#define不仅不能够定义class专属常量,也不能提供任何封装性。
a)
class GamePlayer{ static const int NumTurns=5; //常量声明式 int scores[NumTurns]; .... }; //通常在头文件 const int GamePlayer::NumTurns; //NumTurns定义式,放在源文件
b)
class GamePlayer{ enum {NumTurns=5}; int scores[NumTurns]; .... }; //通常在头文件
enum hack的行为某方面比较像#define,比如取enum和#define的地址不合法,而取const地址合法。如果不想让别人获得一个pointer或reference指向你的某个整数常量,enum可以实现这个约束。
sam3:
对于形似函数的宏,最好改用inline函数替换#define。
#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); }
相关文章推荐
- Effective C++--条款02:尽量以const,enum,inline替换#define(以编译器替换预处理器)
- Effective C++(1-2) 编译器替换预处理器
- Effective C++(1-2) 编译器替换预处理器
- 黑马程序员_Java第25天知识总结_正则表达式_匹配_切割_替换_获取_Pattern_Matcher
- VIM查找替换归纳总结
- VIM查找替换归纳总结
- Python字符串拼接、截取及替换方法总结分析
- Linux---之预处理器,编译器,汇编器,连接器
- C++复习要点总结之六——编译器对属性和方法的处理机制
- YII学习总结6(模板替换和“拼合”)
- VIM查找替换归纳总结
- VIM中常用的替换模式总结
- 【总结】java命令解析以及编译器,虚拟机如何定位类
- [转]Visual C++编译器常用选项设置总结
- 总结GRE作文替换词
- gcc编译器使用技巧总结
- PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
- VIM查找替换归纳总结
- VIM中常用的替换模式总结
- IBM中国编译器团队电面总结