《Effective C++》学习笔记条款02 尽量以const,enum,inline替换#define

                        条款02 :尽量以const,enum,inline替换#define

条款02的内容主要包括以下几方面:

 1、替换#define缘由


      这个条款或许可以改为宁可以编译器替换预处理器。即尽量少用预处理。

      编译过程:.c文件--预处理-->.i文件--编译->.o文件--链接-->bin文件

      预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换。预处理过程还会删除程序中的注释和多余的空白字符。可见预处理过程先于编译器对源代码进行处理。预处理指令是以#号开头的代码行。

     例:#define ASPECT_RATIO 1.653

    记号名称ASPECT_RATIO也许从未被编译器看见,也许在编译器开始处理源代码之前它就被预处理器移走了。即编译源代码时ASPECT_RATIO已被1.653取代。ASPECT_RATIO可能并未进入记号表(symboltable)。

     替换:const double AspectRatio = 1.653;

     好处应该有:多了类型检查,因为#define 只是单纯的替换,而这种替换在目标码中可能出现多份1.653;改用常量绝不会出现相同情况。


 2、常量替换#define两点注意:

  • 定义常量指针:

     const char *authorName = “Shenzi”;
       cosnt std::string authorName("Shenzi");

  • 类专属常量:

     static const intNumTurns = 5;//static 静态常量 所有的对象只有一份拷贝。
    
万一你编译器不允许“static整数型class常量完成“in calss初值设定(即在类的声明中设定静态整形的初值),我们可以通过枚举类型予以补偿:


     
 enum { NumTurns = 5 };


    *   取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。如果你不想让别人获取一个pointerreference指向你的某个整数常量,enum可以帮助你实现这个约束。
     例:#define CALL_WITH_MAX(a,b)   f((a) > (b)) ? (a) : (b))
    
宏看起来像函数,但不会招致函数调用带来的额外开销,而是一种简单的替换。
    
 替换:
      
template<typename T>
      inline voidcallWithMax(cosnt T &a, cosnt T &b)
      {
            f(a > b ? a : b);
       }
     
 callWithMax是个真正的函数,它遵循作用于和访问规则。


3、 请记住:

             

            (1)对于单纯常量,最好以const对象或enums替换#defines

                     (2)对于形似函数的宏,最好改用inline函数替换#defines。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccwRadar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值