Underline () and double underline (_)

根據 C++ standard 17.4.3.1.2 "Global names" 保留名稱有三種,是給 compiler 用的:

  1. 包含連續雙底線的 像是 __atomic_add

  2. 單底線開頭,後面接大寫文字 像是 _MSC_VER

  3. 單底線開頭但後面沒接大寫 像是 _cprintf

1 和 2 是全域保留字,你的程式不管在任何地方都不應該使用 1 或 2 的命名方式, 包括 class 名稱、所有的變數、所有使用 #define 定義的 macro

3 是 global namespace 保留字,只有在自己的 namespace 或 class 內,你才能 使用底線加小寫的名稱,不能放在 global namespace

之所以有這些規則,是因為 preprocessor 並沒有 namespace 的觀念,為了避免 compiler 自己用 #define 定義出來的名稱與 programmer 所用的相衝突,標準 就把比較醜 (前面加底線) 的名稱拿給 compiler 用,讓 programmer 可以使用 比較好看 (不加底線) 的名稱。不過很多人不知道這點,跑去看了 STL source 後可能會覺得前面加底線很酷,而寫出如下的 header:

    #ifndef _MY_HEADER_H
    #define _MY_HEADER_H

    template <typename _T> class {
        ...
    };

    #endif

這是錯誤的命名方式,_MY_HEADER_H 與 _T 前面的底線都應該拿掉。

至於底線配小寫 (_something),我倒是常在 class member variable 中看到。 如果只拿來用在 class 中這樣是 OK 的,只是我也不太喜歡這樣的命名方式。

Reference

© Kimi Tsai all right reserved.            Updated : 2023-07-12 09:04:53

results matching ""

    No results matching ""

    results matching ""

      No results matching ""