→ Anonymoux:Readability,應該就只是一種coding standard而已 11/05 07:25
推 LPH66:有看過不用 __ 開頭的名字的理由是它有可能會和編譯器內部的 11/05 07:31
→ LPH66:不過單一底線我倒覺得用得好的話沒差... 11/05 07:33
→ LPH66:(嘛, 有點像 C++ FAQ 裡說什麼東東是 evil 這樣的感覺 XD) 11/05 07:33
→ LPH66:或者啦, 不用單底線開頭可能是怕在混寫 C 和組合語言時搞混 11/05 07:35
→ LPH66:畢竟 C 語言函式編譯出來的符號是前置一個底線的 11/05 07:35
→ legnaleurc:$ 在 C/C++ 好像也可以當變數名,但asm會錯 XD 11/05 15:38
> -------------------------------------------------------------------------- <
作者: littleshan (我要加入劍道社!) 看板: C_and_CPP
標題: Re: [問題] 絕不使用單一底線開頭的名稱
時間: Sat Nov 5 13:51:16 2011
※ 引述《Arton0306 (Ar藤)》之銘言:
: 在C++編程規範一書中
: 第0項條款
: 有寫到
: 絕不使用所謂「私密名稱」,亦即以單一底線開頭的名稱,或包含連續兩個底線
: 的名稱。
: 請問這是什麼原因,
: 有一些forum 三不五時會看到有人變數命名就是 _something
: 小弟個人是很討厭底線開頭的名稱(因為要多按shift 而且又難看)
: 不過這裡直接列為「絕不使用」
: 不知是什麼原因??
根據 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 的,只是我也不太喜歡這樣的命名方式。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.59.201
推 james732:原來如此 11/05 14:02
推 VictorTom:推長知識:) 11/05 14:11
推 Zephyr750:前後雙底線的__MY_HEADER_H__方式保護重覆宣告呢? 11/05 14:36
→ Zephyr750:應該也是不行吧? 11/05 14:37
→ diabloevagto:底現在後面ok 11/05 15:17
→ legnaleurc:前面有就不行吧,我是 NAMESPACE_DIR_HEADER_HPP 11/05 15:40
→ legnaleurc:衝到的機率會比較低一點 11/05 15:40
推 xatier:長知識了 11/06 01:50
推 tropical72:推, 原來我以前到現在就一直在幹傻事 11/06 02:35
推 Arton0306:大推!感謝! 11/06 03:03
→ letoh:我寫 c 時的 static func 命名幾乎都是 _xxx XD 11/06 10:45
推 allenlinli:長知識了 11/06 18:24
→ hilorrk:原來標準有寫這東西~推 11/06 23:24
→ descent:忘記在那本書看到, 作者建議底線放在後面, 11/07 11:25
→ descent:理由和這篇說的一樣, 從那之後, 我的底線都是放在後面, 11/07 11:26
→ descent:一開始看起來很奇怪, 久了就習慣了。 11/07 11:26
推 Favonia:標準一大堆怪東西 xDDD 11/07 18:22
推 Arton0306:C++編程規範有寫放在後面 也一樣是第0條 11/07 21:20
推 diabloevagto:程式設計師的自我修養:連結、載入、程式庫 11/07 22:57
→ diabloevagto:看了會更了解 11/07 22:57