Underline () and double underline (_)
根據 C++ standard 17.4.3.1.2 "Global names" 保留名稱有三種,是給 compiler 用的:
包含連續雙底線的 像是
__atomic_add單底線開頭,後面接大寫文字 像是
_MSC_VER單底線開頭但後面沒接大寫 像是
_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 的,只是我也不太喜歡這樣的命名方式。