zoukankan      html  css  js  c++  java
  • 尽量以const,enum,inline替换#define

    1、无参宏定义的缺点

      ① 可能会导致编译错误

        记号名称也许从未被编译器看见

        也许编译器在开始处理源码之前,记号名称被预处­理各移走,于是记号名称未进入记号表。

      ② #define 可能会比使用 const 导致更多的码。

      ③ #define 无法创建一个class专属常量,因为#define 并不重视作用域 cope,

        #define 无法定义有封装性的变量,而const可以。

    2. const 定义 class 专属常量  

      ① 为了将常量的作用域限制于 class 内,必须让它成为 class 的一个成员(member)   

        为了保证常量只有一份实体,必须让它成为 static成员,

      ② 有一种情况无须为 class静态成员常量提供定义式,

        该常量为整数类型,且不取其地址。

        为了使用一般编译器,强烈建设提供定义式!

    1 class GamePlayer {
    2 private:
    3     static const int NumTurns = 5;    //静态成员常量的声明式
    4     ...
    5 };
    6 
    7 const int NumTurns;                   //静态成员常量的定义式

    ③ 若编译器不让 static 成员在其声明式上获初值,(in-class初值设定)

      你可以将初值放在定义式.

    ④ 若编译器不让 static 成员在其声明式上获初值,而你想在

      class编译期间需要一个 class 的常量值,

      可使用 "The enum hack",其理论基础为:一个属于枚举

    类型约数值可权充 ints 使用, 

    1 class GamePlayer {
    2 private:
    3     enum {NumTurns = 5};
    4     int scores[NumTurns];
    5     ...
    6 }; 

    ⑤ 用 enum hack 俩个好处,

      enum hack可以阻止用户获得常量的 pointer 或 reference.

      enum和#define 一样绝不会导致非必要的内存分配,

    3、有参宏定义

      有参宏定义可以用template inline代替

  • 相关阅读:
    elasticsearch 5.x 系列之七 基于索引别名的零停机升级服务
    Linux 查看系统硬件信息(实例详解)
    linux grep命令详解
    Boot loader: Grub进阶(转)
    Boot loader: Grub入门(转)
    内核模块管理(转)
    Centos启动流程(转)
    Linux 内核启动流程(转)
    程序的运行顺序(转)
    查询进程打开的文件(转)
  • 原文地址:https://www.cnblogs.com/swenwen/p/12526909.html
Copyright © 2011-2022 走看看