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

  • 相关阅读:
    【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
    【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
    【BZOJ3943】[Usaco2015 Feb]SuperBull 最大生成树
    【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈
    【BZOJ3172】[Tjoi2013]单词 AC自动机
    【HDU2896】病毒侵袭 AC自动机
    【HDU2222】Keywords Search AC自动机
    【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
    结婚晚了
    无毒食品
  • 原文地址:https://www.cnblogs.com/swenwen/p/12526909.html
Copyright © 2011-2022 走看看