Effective C++ (3rd Ed) 读书笔记(一)Item 2: Prefer constS, enumS, and inlineS to #defineS

原创 2013年11月27日 11:59:31

此文是本人在阅读 Effective C++ 第三版原版所记录下的读书笔记。不过与其说是读书笔记,更像是个人整理过后的简略翻译。写这一系列文章的目的是一方面给自己留一个未来的参考,另一方面和有兴趣的朋友一起探讨C++。因为阅读的是原版,而且觉得一些术语还是用英语保留比较好,所以文中会中英文夹杂。


Item 2: Prefer constS, enumS, and inlineS to #defineS


这一条款主要是说尽量不要用 #define, 而用可以达到同样目的的 const, enum 和 inline。此条款也可以理解为偏好compiler而不是preprocessor。

举个例子:#define ASPECT_RATIO 1.653

这个声明里,ASPECT_RATIO 很有可能永远不会被compiler发现,而是在预处理的过程中凡是有 ASPECT_RATIO 出现的地方就用1.653给取代了。这样的话在编译的过程中如果出错,错误会指向 1.653 而不是 ASPECT_RATIO。如果ASPECT_RATIO是在头文件中定义的,然后被多个源文件引用,则跟踪到这个错误很浪费时间。相应的用以下方式更好:

const double AspectRatio = 1.653 这样的话编译器能跟踪到AspectRatio这个变量。 

不过在用 const 取代 #define的时候,有两个特殊情况值得一提:

第一是在 define constant pointer 的时候,因为constant definition 一般是在头文件里,所以将 pointer 声明为 const 和 将其指向的内容声明为 const 很重要 (写两次const)。

举个例子: const char* const authorName = "Scott Meyers";

关于上面这个例子,另外值得一提的是,尽量用C++ 的 string 类型,而少用 C-style string,这一点在<<C++ Primer>>和很多地方都有提到。

所以达到同样的效果,这样更好:const std::string authorName("Scott Meyers");

第二个特殊情况是跟类相关的constants。为了保证这个constant的范围是只在类里面,而且最多只有一次复制,你必须将它声明为static。

举个例子:

Class GamePlaer {

private:

static const int NumTurns = 5;

}

以上只是声明,一般的情况下C++要求你还要定义NumTurns这个变量。不过static 和 整形(例如:integers, chars, bools)是特例。这个可以在程序中进行尝试,看变量是否可以被赋值。

另外一种实现上述例子的方式是

Class GamePlaer {

private:

enum { NumTurns = 5};

int scores[NumTurns];

}

熟悉enum的用法有两个好处:一个是它更像 #define 的方式,第二个是大量的程序在用enum,熟悉后方便看懂别人的程序。

最后,如果有简单的函数是用 #define 声明的,像:#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))

这样的方式问题非常多,而且行为常常不可预测。

所以用inline取代#define要好很多。例如:

template<typename T>

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

{

f (a > b ? a : b);

}


综上所述,虽然 #define用的地方少了,但是preprocessor还是很重要的。比如说#ifdef / #ifndef 还要用它。总而言之,还不到淘汰preprocesor的时候,但是你应该让它经常长时间的放假。


Effective C++ Item 2:Prefer constS, enumS, and inlineS to #defineS

这个条款叫“喜欢编译器胜过预处理器”更贴切。因为#define不被视为语言的一部分。当你这样写时, #define ASPECT_RATIO 1.653 符号名ASPECT_RATIO对于编译器来讲是...
  • hfutqianwei
  • hfutqianwei
  • 2010年05月05日 15:37
  • 214

effective C++ Item 2: Prefer consts, enums, and inlines to #defines

前面一款基本上就是介绍性的内容,这一节进入主题。   条款二:尽量以const,enum,inline代替#define   1:使用const代替#define定义常量。     如果你定义圆...
  • manyouzhelilixi
  • manyouzhelilixi
  • 2011年08月22日 21:42
  • 266

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

Item 02: Prefer consts, enums, and inlines to #defines 尽量以 const,enum,inline 替换 #define 假如有这样的语句:#...
  • iorichang
  • iorichang
  • 2016年07月17日 12:37
  • 138

Effective C++读书笔记——(一)Prefer consts, enums, and inlines to #defines

const与to #define的不同之处和const的优势
  • zhhx310
  • zhhx310
  • 2014年04月17日 14:15
  • 445

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

#define ASPECT_RATION 1.653 存在的问题:#define所定义的名称可能没有进入symbol table。 解决方法:用const替换#define const dou...
  • wanglongfei_hust
  • wanglongfei_hust
  • 2013年01月29日 16:23
  • 201

Effective C++ 2. Prefer consts, enums, and inlines to #defines

consts & enums & inlines
  • ruihuank
  • ruihuank
  • 2017年10月20日 16:24
  • 59

Effective C++读书笔记(3)-Item 2: Prefer consts, enums, and inlines to #defines

Item 2: Prefer consts, enums, and inlines to #defines   This Item might better be called "prefe...
  • Geek4IT
  • Geek4IT
  • 2012年11月02日 13:04
  • 239

《Effctive C++》读书笔记--(02)Prefer consts,enums,and inlines to #defines

宁可以编译器替换预处理器。 宏的缺点: 由于#define宏定义由预处理器管理,通常可以理解为宏即为替换,例: #define LENSIZE 20     在预处理时,编译器会将代码中的所有...
  • monkey1874
  • monkey1874
  • 2016年03月15日 14:41
  • 101

[翻译] Effective C++, 3rd Edition, Item 2: 用 consts, enums 和 inlines 取代 #defines

Item 2: 用 consts, enums 和 inlines 取代 #defines作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http...
  • fatalerror99
  • fatalerror99
  • 2005年06月29日 21:58
  • 5817

[翻译] Effective C++, 3rd Edition, Item 39: 谨慎使用 private inheritance(私有继承)(上)

Item 39: 谨慎使用 private inheritance(私有继承)作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blo...
  • fatalerror99
  • fatalerror99
  • 2005年11月22日 22:13
  • 5869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Effective C++ (3rd Ed) 读书笔记(一)Item 2: Prefer constS, enumS, and inlineS to #defineS
举报原因:
原因补充:

(最多只允许输入30个字)