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取代它吧!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章