Effective_C++:1、尽量以const和inline取代#define

1、尽量以const和inline取代#define

1、#define是啥

        #define被称为宏定义,是用来定义一个常量的,会在预编译期间直接进行文本替换。主要用于以下场景:

        1.后接一个参数,用来定义标识,表示这个标识此处被定义。常用于#ifndef、#define、#endif结构,来防止头文件被重复包含。

#ifndef MYSTRING_H_
#define MYSTRING_H_
...
#endif
        2.后接两个参数,在预编译期间进行文本替换。故可用于定义常量和函数,用简洁或带有含义的标识来代替这个常量或函数,单纯地将源码中的前者替换为后者。尽量以const和inline来取代。
#define PI 3.14
#define max(a, b) ((a) > (b) ? (a) : (b)

2、为啥要取代#define

        1.当使用#define定义的常量编译出错时,由于预编译在编译之前进行,所以编译器在出错说明中可能不会提到标识(如PI),而是提到常量(3.14),导致不能快速地定位问题所在。
        2.在定义函数时,要将所有引数加小括号,防止运算符优先顺序被打乱。然而,仍可能出现与调用者预期不符的情况。如下,调用者预期a、b自增一次,实际上某个值可能会增加两次。
#define max(a, b) ((a) > (b) ? (a) : (b))
...
max(++a, ++b);

3、以const和inline取代#define

        1.使用const,定义常量、常量指针(指针为常量)、指向常量的指针(指针指向的对象为常量)、类专属常量等,其中,类中,定义全体对象公用的常量时,若为整型,可在头文件中定义:

class base
{
private:
    static const int MAX_SIZE = 100;
    ...
public:
    ...
}
class base
{
private:
    enum { MAX_SIZE = 100 };
    ...
public:
    ...
}

若不为整型,则需要在头文件中声明,在实现文件中定义。如此,来解决#define可能带来的问题。

        2.使用inline,代替#define。它会进行类型检查,将参数传进函数并替换为函数本体。如:

inline int max(int a, int b){return a > b ? a : b;}
template<typename T>
inline const T& max(const T& a, T& b){return a > b ? a : b;}

这里,使用模板来使得max()适用于更多类型,而不仅仅是int型。

        因此,使用#define时,多想想能否以const和inline取代它吧!


猜你喜欢

转载自blog.csdn.net/l1dian11/article/details/80872935
今日推荐