2015-09-27 65 views
-4

雙undescores有任何技術原因,標準庫(C或C++)實現到,IMO濫用,強調他們的方式(=前綴有兩個undescore +家居添加一個結尾下劃線來表示一個變量是一個成員變量)?原因四標準庫的實現

我得到/.*__.*//_[A-Z].*/(< = regexes)是通過實現保留的。但是,這不是指應用編譯器而是(標準)庫嗎?

不能一個標準庫的行爲就像在選擇其內部名稱方面的任何其他圖書館嗎?

+1

這不是濫用,實現_shall_使用保留標識符。 – edmz

+8

標準庫*是*「實施」的一部分。它在C和C++規範中與語言本身一樣定義。 –

+0

這顯然不是http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier的副本。這是關於stdlib實現中雙重不良內容的原因是什麼。 「儘管除非你是羊,否則這不是一個好理由。確保沒有用戶定義的具有合法標識符的宏將與stdlib標題衝突。 – PSkocik

回答

3

有一個很好的理由,標準庫與兩個下劃線開始內部名稱:這樣的名稱被保留用於執行。

試想一下,你寫了下面的代碼:

#include <iostream> 

using namespace std; 

long square(long x) 
{ 
    return x*x; 
} 

int main() 
{ 
    cout << square(3) << endl; 
} 

我猜你會不會很高興,如果這最終調用執行標準庫和做一些完全不同的使用一些內部功能square(int),因爲它是一個更好的square(3)匹配比您的square(long)

通過與雙下劃線,並在同一時間的標準,宣佈你不能做同樣的前綴所有的內部名稱,標準庫的作者確保這樣的事情不會發生。

現在你可以說<iostream>不是STL的一部分,但是每個標準庫頭可以包含任何其他標準庫頭,因此iostream可能包含一個STL頭以供其實現使用。

另一個原因是雙下劃線標識即使在沒有外部看到本地標識符的情況下作出的感覺是,你可能已經定義了一個同名的宏。試想一下:

#define value 15 

#include <iostream> 

int main() 
{ 
    std::cout << value; 
} 

這是合法的代碼,當然應該輸出15.但是現在想象一下,如果發生在iostream一些對象中聲明的局部變量名value。你的代碼顯然不能編譯。

注意,標準庫是實現的一部分(它在C++標準銀行所描述的,畢竟),因此是什麼樣子就可以使用保留名稱。

+0

對不良問題的回答沒有用。請閱讀George Cummins的帖子[這裏](https://meta.stackoverflow.com/questions/252506/question-quality-is-dropping-on-stack-overflow)。 – edmz

+0

有靜態函數(=匿名命名空間函數)來防止在全局範圍發生衝突。 std命名空間也會照顧到這一點。對於結構/類成員,這是私有的。在我看來,除了雙倍的不滿意之外,還有很多手段。 – PSkocik

+3

@black:這個問題顯然不屬於「機械特克」類別。我也不同意這是一個糟糕的問題。 – celtschk