Re: [問題] 絕不使用單一底線開頭的名稱

看板C_and_CPP作者 (我要加入劍道社!)時間12年前 (2011/11/05 13:51), 編輯推噓10(10010)
留言20則, 13人參與, 最新討論串2/2 (看更多)
※ 引述《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

11/05 14:02, , 1F
原來如此
11/05 14:02, 1F

11/05 14:11, , 2F
推長知識:)
11/05 14:11, 2F

11/05 14:36, , 3F
前後雙底線的__MY_HEADER_H__方式保護重覆宣告呢?
11/05 14:36, 3F

11/05 14:37, , 4F
應該也是不行吧?
11/05 14:37, 4F

11/05 15:17, , 5F
底現在後面ok
11/05 15:17, 5F

11/05 15:40, , 6F
前面有就不行吧,我是 NAMESPACE_DIR_HEADER_HPP
11/05 15:40, 6F

11/05 15:40, , 7F
衝到的機率會比較低一點
11/05 15:40, 7F

11/06 01:50, , 8F
長知識了
11/06 01:50, 8F

11/06 02:35, , 9F
推, 原來我以前到現在就一直在幹傻事
11/06 02:35, 9F

11/06 03:03, , 10F
大推!感謝!
11/06 03:03, 10F

11/06 10:45, , 11F
我寫 c 時的 static func 命名幾乎都是 _xxx XD
11/06 10:45, 11F

11/06 18:24, , 12F
長知識了
11/06 18:24, 12F

11/06 23:24, , 13F
原來標準有寫這東西~推
11/06 23:24, 13F

11/07 11:25, , 14F
忘記在那本書看到, 作者建議底線放在後面,
11/07 11:25, 14F

11/07 11:26, , 15F
理由和這篇說的一樣, 從那之後, 我的底線都是放在後面,
11/07 11:26, 15F

11/07 11:26, , 16F
一開始看起來很奇怪, 久了就習慣了。
11/07 11:26, 16F

11/07 18:22, , 17F
標準一大堆怪東西 xDDD
11/07 18:22, 17F

11/07 21:20, , 18F
C++編程規範有寫放在後面 也一樣是第0條
11/07 21:20, 18F

11/07 22:57, , 19F
程式設計師的自我修養:連結、載入、程式庫
11/07 22:57, 19F

11/07 22:57, , 20F
看了會更了解
11/07 22:57, 20F
文章代碼(AID): #1EjCxNm6 (C_and_CPP)
文章代碼(AID): #1EjCxNm6 (C_and_CPP)