2008-10-22 179 views
78

我正在瀏覽一些開源的C++代碼,並注意到在代碼中使用得分的情況下,主要是在變量名稱的開頭。爲什麼人們在C++中如此使用__(雙下劃線)

return __CYGWIN__; 

只是想知道是有原因,還是隻是一些人的代碼樣式?我會認爲我很難閱讀。

+1

爲何難讀?它的設計主要是作爲一個分隔符,就像引號一樣。我記得,它主要用於內建常量。 – 2008-10-22 03:40:20

回答

107

Programming in C++, Rules and Recommendations

在標識符中使用兩個下劃線的(`__')根據ANSI-C標準保留用於編譯器的內部使用。

下劃線(`_')中的庫函數的名稱(如 「_main」 和 「_exit」)經常被使用。爲避免衝突,請勿使用下劃線開始標識符。

+0

該指南看起來像是在`namespace`引入之前編寫的。 – 2017-05-28 18:47:47

8

這是你不想在'普通'代碼中做的事情。這確保了編譯器和系統庫可以定義不會與你碰撞的符號。

32

根據C++標準,以一個下劃線開頭的標識符爲庫保留。以兩個下劃線開頭的標識符保留給編譯器供應商。

+14

不僅如此:保留了其中包含雙下劃線的標識符*。 17.4.3.1.2 – 2008-10-22 11:24:24

+0

在C++中,我只看到[lex.name]和全局名稱[global.names]。你能提供參考嗎?謝謝 – 2014-01-11 02:18:08

9

上述意見是正確的。 __Symbol__通常是您的有用編譯器(或預處理器)供應商提供的神奇令牌。也許這些中使用最廣泛的是__FILE____LINE__,它們被C預處理器擴展爲指示當前文件名和行號。當你想記錄某種程序斷言失敗時,這很方便,包括錯誤的文本位置。

1

除了許多其他的人回答一下,有些人還打着宏或者將#define值與預處理使用庫。這樣可以更容易處理,並且可能允許舊版編譯器中的錯誤得到解決。

和其他人一樣,它有助於防止名稱衝突,並有助於在庫變量和自己的變量之間進行劃分。

46

除非他們認爲他們是「實施的一部分」,即標準庫,否則他們不應該這樣做。

這些規則相當具體,比其他人建議的要細一些。

包含一個雙下劃線或以下劃線後跟一個大寫字母開頭的所有標識符保留在所有範圍內使用的實施,即它們可以用於宏。

此外,這以下劃線開頭所有其它標識符(即,不是後跟另一個下劃線或一個大寫字母)被保留用於在全球範圍內的實施。這意味着您可以在您自己的名稱空間或類定義中使用這些標識符。

這就是爲什麼微軟使用功能名稱與前導下劃線和所有小寫的許多他們的核心運行時庫函數,它們不是C++標準的一部分。這些函數名稱保證不會與標準C++函數或用戶代碼函數衝突。

相關問題