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

原创 2011年08月22日 21:42:47
  前面一款基本上就是介绍性的内容,这一节进入主题。

  条款二:尽量以const,enum,inline代替#define

  1:使用const代替#define定义常量。

    如果你定义圆周率如下:

#define PI 3.1415926

   那么意味着预处理器将会把程序中出现PI的地方都替换为value(3.1415926),这样的话在编译阶段PI不会进入到符号表中,调试的时候如果此处出现错误,只会提示说 3.1415926怎么怎么样,而不是PI怎么样。对于大程序来说,无疑给程序的调试带来很大困难,因为你有时候根本想不起来这个值是怎么来的。

      推荐做法:以

 const  double PI = 3.1415926

      代替。

  2:使用enum代替#define

    当你编译阶段需要一个常量值时,const就无能为力了。这时你需要enum。

    比如你定义一个数组:

int scores[numTurns];

   编译器坚持要知道numTurns的大小。这时候可以使用enum:

enum{numTurns=5};

   enum的行为很像#define,区别是enum可以取地址,而#define则不行。与const的区别就是:const数据有类型,而enum的隐含数据类型是整数,其最大值有限,且不能表示浮点数。

  3:使用inline代替#define

    用#define实现宏,作用和函数一样,却没有函数调用时的开销,但是宏定义查查引起不必要的错误,比较经典的就是两数比较: 

#define CALL_WITH_MAX(a,b)  f((a)>(b)?(a):(b))


尽管你每个变量都加了括号,但还是有错误发生,那就是传入++a,b,当a>b时,会发生a加两次的情况,这个都懂的。你可以用下面的语句代替:

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


inline取得了和宏定义一样的高效,并在其基础上增加了安全性。

   但#define还是有其用武之地的,看看MFC类库就明白了。

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
  • 216

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
  • 139

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++读书笔记——(一)Prefer consts, enums, and inlines to #defines

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

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

#includecxvxv
  • persimmon2010
  • persimmon2010
  • 2013年11月27日 11:59
  • 307

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
  • 243

《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
  • 5848

Prefer const, enum ,inlines to #defines

/*  * File:   main.cpp * Author: qzhao * 这个章节是关于在进行C++日常开发的时候,尽量使用const 或者enum 取代传统的C define 宏, * 宏是...
  • zhaoquanguo
  • zhaoquanguo
  • 2011年07月02日 15:36
  • 194
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective C++ Item 2: Prefer consts, enums, and inlines to #defines
举报原因:
原因补充:

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