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代替

  • 相关阅读:
    HDU 1176 免费馅饼(DP)
    微通道的兵锋 阿里将血腥
    head first c<11>在根据网络编程
    ZOJ 3795 Grouping(Tarjan收缩点+DAG)
    【设计和算法分析】3、二进制搜索
    杨:联想的创新将成为打造最酷的助推力的重要器件
    android 如何将电话簿SDN数字和其他普通的数字混合在一起?
    redhat6.3已安装was6.1你可以不弹出安装程序
    Android属于查询执行情况的电话号码
    table在 点击线条颜色
  • 原文地址:https://www.cnblogs.com/swenwen/p/12526909.html
Copyright © 2011-2022 走看看