Effective C++(1-2) 编译器替换预处理器
- C
- Object-Oriented C++: 面向对象
- Template C++:泛型编程
- STL
#define ASPECT_RATIO 1.653记号名称ASPECT_RATIO在被编译器识别之前,已经被预编译器替换为1.653了,所以名称ASPECT_RATIO有可能没进入记号表内。解决方法:
const double AspectRatio = 1.653;
性能影响:对浮点常量而言,使用常量可能币使用#define导致较小量的码,因为预处理“盲目地将宏名称ASPECT_RATIO”替换为1.653。
2.2 关于const的一个知识点
若要定义一个char*字符串,必须写const两次
const char* const authorName = "Scott Meyers";
若替换为String对象则更好:
const std::string authorName("Scott Meyers");
2.3 class专属常量
static, 将常量的作用域限制于class内,且确保此常量至多只有一份实体。class GamePlayer {
private:
static const int NumTurns = 5; //常量声明式
int scores[NumTurns]; //使用该常量
};
这里的NumTurns是个声明式,而不是定义式。一般情况下,这样做就足够了,声明并使用它,但是有两种情况需要你给出一个关于它的定义式:1 取这个class专属常量的地址2 编译器坚持要看到一个定义式这时候就需要一个额外的定义式:const int GamePlayer::NumTurns; // 由于class常量已在声明时或得初值,因此定义时不可以再设初值。如果旧式的编译器不支持“in-class 初值设定”,那么可以把初值的设定放在定义式中:class CostEstimate {
private:
static const double FudgeFactor;
...
};
ConstEstimate::FudgeFactor = 1.35; // 位于实现文件内
如果你的编译器不够优秀,不允许"static整数型class常量"完成“in class初值设定”,那么,就有必要认识一下enum hack。先看一下补偿的做法:
class GamePlayer {
private:
enum { EnumTurns = 5 };
int scores[NumTurns];
};
现在来正式认识一下enum hack:
1 enum hack的行为某些方面比较像#define而不是const,如:
- 取一个enum的地址是不合法的,同样的,取一个#define的地址通常也不合法;
- 不允许一个指针或者引用指向某个enum常量;
- Enums和#defines绝不会导致非必要的内存分配。
2 实用主义: 事实上,“enum hack”是template metaprogramming(模版元编程)的基础技术。
// 以a和b的较大值调用f
#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被累加一次
神奇的事情就是,a的递增次数取决于“它被拿来和谁比较”。
解决办法: template inline函数
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f ( a > b ? a : b);
}
- 对于单纯常量,最好以const对象或者enum替换#define
- 对于形似函数的宏, 最好改用inline函数替换#define
Effective C++(1-2) 编译器替换预处理器的更多相关文章
- Effective C++ 条款二 用编译器替换预编译器
/************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...
- [Objective-C语言教程]预处理器(18)
Objective-C预处理器不是编译器的一部分,而是编译过程中的一个单独步骤. 简单来说,Objective-C预处理器只是一个文本替换工具,它指示编译器在实际编译之前进行必要的预处理. 我们将Ob ...
- C语言笔记 10_文件读写&预处理器
文件读写 上一章我们讲解了 C 语言处理的标准输入和输出设备.本章我们将介绍 C 程序员如何创建.打开.关闭文本文件或二进制文件. 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C ...
- C和指针 第十四章 预处理器 头文件
编写一个C程序,第一个步骤称为预处理,预处理在代码编译之前,进行一些文本性质的操作,删除注释.插入被include的文件.定义替换由#define定义的符号,以及确定代码的部分内容是否应该按照条件编译 ...
- 详解C/C++预处理器
C/C++编译系统编译程序的过程为预处理.编译.链接.预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序.预处理器指令以#号开头标识,末尾不包含分号.预处理命令不是C/C++语 ...
- C Primer Plus之C预处理器和C库
编译程序前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语. 预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本. ...
- C和指针 (pointers on C)——第十四章:预处理器
第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...
- CSS 预处理器中的循环
本文由 nzbin 翻译,黄利民 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/91016/ 如果你看过老的科幻电影,你一 ...
- Microsoft Visual C++ 6.0预处理器参考手册
返回总目录 Microsoft Visual C++ 6.0 预处理器参考手册 目录引言........................................................ ...
随机推荐
- manjaro 清理系统
sudo pacman -Rsn $(pacman -Qdtq) sudo pacman -Scc sudo rm /var/lib/systemd/coredump/. sudo journalct ...
- 关于js语法(运算中出现无限大的问题)本身的错误的解决方案
错误原因: 一是 JavaScript 浮点数计算的 Bug, 另一个是和计算机最终转换成二进制计算有关系 解决方案: 第一种就是利用JavaScript 的toFixed(n) 方法,直接获取N 位 ...
- 定时删除elasticsearch索引
从去年搭建了日志系统后,就没有去管它了,最近发现大半年各种日志的index也蛮多的,就想着写个脚本定时清理一下,把一些太久的日志清理掉. 脚本思路:通过获取index的尾部时间与我们设定的过期时间进行 ...
- Linux 的启动流程--转
http://cloudbbs.org/forum.php?mod=viewthread&tid=17814 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用 ...
- 66_Plus-One
目录 66_Plus-One Description Solution Java solution Python solution 1 Python solution 2 Python solutio ...
- mysql数据库引擎InnoDB和MyISAM
一.Mysql锁分类 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面 ...
- VS中自定义C#快速简写代码
首先在VS中找到工具——代码片段管理器——语言选择(CSharp)——Visual C#——赋值路径——根据路径找到对应的代码片段用VS打开 修改: Title——标题 ShortCut——缩写 D ...
- <深入理解JavaScript>学习笔记(2)_揭秘命名函数表达式
写在前面的话 注:本文是拜读了 深入理解JavaScript 之后深有感悟,故做次笔记方便之后查看. 感觉这章的内容有点深奥....略难懂啊. 先坐下笔记,加深一下印象吧. 我主要记一下自己感觉有用的 ...
- 怎么使用fiddler 测试post get 接口
直接上图 测试 post
- 添加FB登陆时,需要curl扩展
安装curl扩展遇到一个傻逼问题 [root@xxx openssl]# /usr/local/php/bin/phpizeCannot find config.m4.Make sure that y ...