宏定义

#define ASPECT_RATIO 1.653

ASPECT在编译之前已被预编译就行替换,不会进入符号表(symbol table),
如出现1.653导致的编译错误,不方便调试追踪。

可以使用

const double AspectRatio = 1.653

AspectRatio会进入符号表。

类中宏定义

class GamePlayer
{...
private:#define NUM_TURNS 5int scores[NUM_TURNS];
};

可以将其定义为static const(const static一样)类型,

class GamePlayer
{...
private:static const int NUM_TURNS = 5; // static const类型的数据成员中只有static const int成员能够进行类内初始化int scores[NUM_TURNS];
};

也可以使用enum hack,

class GamePlayer
{...
private:enum { NumTurns = 5 };int scores[NumTurns];...
};

宏定义函数

#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); // a被累加二次
CALL_WITH_MAX(++a, b+10); // a被累加一次

即使在每个参数都加上小括号,任然会出现边际效用。
调用f之前,a的递增次数取决于"它被拿来和谁比较"!

替代方法:

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

结论:
使用const是、enums和inlines可以降低对预处理(特别是#define)的需求,但仍有使用它的需求: 包含头文件之#include、条件编译#ifdef/#ifndef。

请记住:

  • 对于单纯常量,最好以const对象或enums替换#defines。
  • 对于形似函数的宏,最好以inline函数替换#defines。

02. Prefer consts, enums, and inlines to #defines相关推荐

  1. Item 02: Prefer consts, enums, and inlines to #defines

    Item 02: Prefer consts, enums, and inlines to #defines 尽量以 const,enum,inline 替换 #define 假如有这样的语句: #d ...

  2. Effective C++记录(2):Prefer consts, enums, and inlines to #defines

    尽量用const, enum, inline 替换 #define 原因如下: 降低对预处理器的需求(#define). 弘定义对代码理解上存在巨大的开销(例如:带参弘定义,可能造成使用上的误解,以及 ...

  3. Effective C++读书笔记 摘自 pandawuwyj的专栏

    Effective C++读书笔记(0)       Start   声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节.   std::size_t numDigits(i ...

  4. Effective C++ 改善55个方法

    美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...

  5. Effective C++读书摘要--Accustoming Youself to C++

    <Item 1>View C++ as a federation of languages. 1.把C++看成4种子语言组成,即C.Object-Oriented C++.Template ...

  6. 【Cpp】《Effective C++》第一章-让自己习惯C++

      这是我在学习<Effective C++>中总结得出的心得与体会,完全是以我自己的理解所作的笔记,是对个人经验的积累.基于第三版我以每个章节进行总结,全书一共九个章节. 第一章-让自己 ...

  7. Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  8. Effective C++知识点

    条款01:视C++为一个语言联邦(View C++ as a federation of languages.) 对于内置类型而言,pass-by-value通常比pass-by-reference高 ...

  9. 关于const关键字

    C++的const关键字标记了一个变量(或者函数)的常量属性,程序员通过const关键字告诉编译器:这个变量是不可修改的常量,任何企图对其进行修改的操作不要通过编译. const关键字的使用比较容易混 ...

  10. C++之const关键字

    const作用 const关键字在C++中真是无处不在,无论是函数参数,还是函数返回值,还是函数末尾都经常会看到const关键字,这表明C++中的const关键字是非常灵活的, 合理地使用const关 ...

最新文章

  1. 对面向接口编程、按分层建项目的反思和新的分层结构思路
  2. rails 如何 支持 bootstrap3
  3. postgresql user表
  4. Vxscan:一款实用综合扫描工具
  5. 【luogu1337】【JSOI2004】平衡点 / 吊打XXX(模拟退火)
  6. android浮动按钮_Android浮动操作按钮示例教程
  7. Windows 10安裝.net Framework 3.5出現0X800F0954錯誤
  8. c语言 python rsa库_python如何调用libcrypto实现RSA解密?
  9. js批量创建钱包地址并保存私钥
  10. 关于XDC工具的文章
  11. pow函数需要注意的问题
  12. 通过pytorch建立神经网络模型 分析遗传基因数据
  13. vue 移动端校验(是否移动设备,安卓/IOS,是否微信浏览器)
  14. Windows——如何关闭笔记本自带键盘
  15. Smart-Link、Monitor-Link介绍与配置举例
  16. Ubuntu上软件安装
  17. LearnGL - 06.1 - Matrix - 矩阵02 - 向量空间、向量空间的维度、为何矩阵乘法要有 [M x N] * [N * P] 的 N 要相等的限制
  18. 逐梦C++之四:四种强制类型转换
  19. 感冒了,很难受,但.....
  20. CSS,给你点“颜色“看看

热门文章

  1. 修改 Ubuntu SSH 登录后的欢迎信息
  2. Jquery 查看DOM上绑定的事件列表
  3. 修改ewebedit编辑器图片上传大小限制
  4. 常用正则表达式及基础语法
  5. 59. DNS 服务器
  6. 9.使用 curses 函数库来管理基于文本的屏幕
  7. 43.访问控制过滤器(Access Control Filter)
  8. 5. Mac phpstorm 快捷键
  9. 1.WebServices 简介
  10. html5中web存储(localStorage、sessionStorage)与cookie的区别?????