zoukankan      html  css  js  c++  java
  • [Effective C++ 002]尽量以const,enum,inline替换#define

    一、尽量以const,enum,inline替换#define(或以编译器代替预处理器)

    1)#define在N-Orca中的应用

    2)Const替换 #define
    首先经常会 #define ASPECT_RATO 1.63
    由于记号ASPECT_RATO有可能不被计入记号表内,所以当编译发生错误时,可能会带来困惑。(尤其是在ASPECT_RATO为非自己所写的的时候)
    解决方法:
    const double aspectRato = 1.63;
    这些写,aspectRato肯定会被编译器看到。
    而且使用常量可能比使用#define导致更少的目标码。(因为预处理器会将ASPECT_RATO替换为1.63)

    用了Const来定义常量时,通常以下格式:
    static const int num = 5;

    #define 不能定义一个Class的专属常量,应为#define不重视作用域。一旦宏被定义,在其后的编译构成中就有效。

    3)enum替换 #define
    但当你的Class的专有成员不希望被取其地址,或引用的时候。可以通过enum来实现。
    class A
    {
    private:
    enum { num = 5 };
    int a[num];
    }
    因为取一个enum的地址是不合法的

    4)inline替换 #define
    首先看一个例子:

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

    使用方法:
    int a = 5 , b = 0 ;
    CALL_WITH_MAX(++a,b)
    CALL_WITH_MAX(++a,b+10)
    以上,调用又有什么后果呢?

    可以用templte inline来替换以上实现,如下:
    template<typename T> inline void callWithMax(const T& a, const T& b)
    {
    f(a > b ? a : b);
    }

    总结:
    1)对于单纯的变量,最好以const或enums替换#defines。
    2)对于形似函数的宏,最好改用inline函数替换#defines

  • 相关阅读:
    s
    qq
    qqq
    q
    qq
    http请求报文
    qq
    q
    qqq
    java对象-String的用法
  • 原文地址:https://www.cnblogs.com/hustcser/p/2730583.html
Copyright © 2011-2022 走看看