zoukankan      html  css  js  c++  java
  • effective C++ 2 prefer consts, enums and inlines to #defines

    如果有#define A 1.23

    这个记号A可能没进入记号表,那么如果在运用这个常量时发生了编译错误,错误信息提到了1.23而不是A,那么追踪这个错误就很费时,因为不知道这个1是哪里来的.

    而如果用const double A = 1.23,那么A肯定会进入记号表,也就避免了上面的情况。并且对于浮点常量,常量可能比使用#define导致较小的码(因为如果是宏名称,会无条件把所有的A替换成1.23的)。

    用常量替换#define时需要注意两种情况:

    1.为了方便被多个文件引入,常量定义一般放在头文件里。对于常量指针,要把指针声明为const。

    2.class专属常量。这也是优于#define的一个地方,因为#define不存在作用域一说。如果需要将常量的作用域限于class,那么需要让它成为class的一个成员,并且只有一个实体,所以它要是一个static成员。

    而在class内部的只能算是声明式,所以还需要在一个实现文件里加入定义式,比如:

    class A {
    
    private:
    
      static const int Num;//static class 常量声明
      int array[Num];
    };
    const int A::Num;//static class常量定义,在实现文件里

    假如编译器不支持static整数型class常量完成in class初值设定,那么可以采用enum hack,就是一个属于枚举类型的数值可以被当作int使用:

    可以把上面的A改成这样:

    class A {
    
    private:
    
      enum {Num =5}
      int array[Num];
    };

    最后提到了用inline函数替代像函数一样的宏,后面似乎会更详细的说明,所以先放一下。

  • 相关阅读:
    暴雪HASH算法(转)
    实现的一些内存辅助操作函数
    仿SGI STL的traits技法
    c++实现kd树
    利用libpcap打印ip包
    在使用cognos时遇到的问题记录帖
    DW,DM,ODS的区别
    解决问题的8种职业能力
    ASP.NET网站怎么发布 Web项目程序怎么发布部署(暂时收藏)
    关于IIS和.NET 4.0的问题总结(转)
  • 原文地址:https://www.cnblogs.com/parapax/p/3635104.html
Copyright © 2011-2022 走看看