• C++ 笔记(一) —— 尽量以 const、enum、inline 替换 #define


    ilocker:关注 Android 安全(新手) QQ: 2597294287

    1 #define ASPECT_RATIO  1.653

    记号 ASPECT_RATIO 不会进入 symbol table,因为它在预处理阶段就被替换了。

    如果运用此常量时获得了一个编译错误,并且该宏定义又非自己所写,就会对 1.653 为何意、来自何处而感到困惑。于是,我们会因为追踪代码而浪费时间。

    应以常量取而代之:

    1 const double kAspectRatio = 1.653;

    这样没准还会减小 object code 的体积,因为预处理器“盲目”的进行宏替换,可能会导致多份 1.653。

    如果要定义一个常量的 char * 字符串,则:

    1 const char * const kAuthorName = “Scott Meyers”;

    两个 const,一个约束字符串内容不可变,一个约束字符串指针不可变。

    或者这样:

    1 const std::string kAuthorName(“Scott Meyers”);

    另外,宏没有作用域的限制,也不能提供任何封装性,但 const 常量可以。

    1 class GamePlayer {
    2 private:
    3   static const int kNumTurns = 5;
    4   int scores[kNumTurns];
    5 }

    然后在定义文件中:

    1 const int GamePlayer::kNumTurns;

    如果不是在数组声明中用到了 kNumTurns,其初值的设定也可以放到定义中。

    如果编译器不支持 in-class 初值设定,也可用所谓的 “the enum hack” 手法:

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

    也许对于此种应用,enum hack 的方式更好。enum hack 的行为更相像于 #define,因为对于一个 enum 值,同样不能取其地址。

    #define 的另一个常见用处是定义一个“伪函数”,而调用它不会招致 function call 带来的额外开销。

    1 #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

    定义这种宏要十分小心,每个实参都要加上小括号,但仍应对不了下述情况:

    1 CALL_WITH_MAX(++a, b); //a可能会被累加两次

    这种情况下,可以 template inline 函数代之:

    1 template<typename T>
    2 inline void CallWithMax(const T &a, const T &b) {
    3     f(a > b ? a : b);
    4 }

    最后,#define 也许只需用于防止头文件的重复 include。

    学习资料: 《Effective C++》

  • 相关阅读:
    Python操作Word:常用对象介绍
    Python入门教程 超详细1小时学会Python
    用几何画板画七边形的方法
    用ChemDraw画3D图的方法
    Chem 3D模型的参数值更改方法
    Chem 3D中怎么创建立体模型
    在几何画板中输入绝对值的方法
    怎么给几何画板文字加立体阴影效果
    几何画板放大和缩小的方法
    ChemDraw Pro和ChemBio3D Ultra有什么区别
  • 原文地址:https://www.cnblogs.com/ilocker/p/4720655.html
Copyright © 2020-2023  润新知