2008-10-18 18 views
16

當使用C++的命名空間,你更明確他們的名字,像這樣:你更喜歡顯式命名空間還是C++中的「使用」?

std::cout << "Hello, world!\n"; 

或者您using namespace

using namespace std; 
cout << "Hello, world!\n"; 

如果你更喜歡後者,你宣佈你在文件或函數範圍使用?我個人更喜歡明確地命名它們 - 它的輸入更多,但是當使用混合名稱空間時(例如stdboost),我覺得它更具可讀性。

回答

17

我總是用using namespace作爲std &的提升。除此之外,我傾向於使用明確的名稱空間,除非它被使用太多以致於會混淆代碼。

在標題中,我從不使用using namespace來避免污染#including源的全局名稱空間。

2

當只有一些不明確的地方時,我才使用顯式名稱空間。它更具可讀性,但額外的輸入過於乏味,您必須假定其他開發人員對標準庫有熟悉程度的基準級別。

我拼寫一個命名空間的唯一時間是當我只使用它一次或兩次,如添加一個快速調試語句,或者如果我使用一些非標準庫。

我通常在文件範圍聲明名稱空間,但是如果混合了名稱空間,則可以在函數範圍內使聲明更接近它所使用的位置。

19

我總是使用明確的。寫std不會傷害我,我清楚地看到它從哪裏來。當你有一些遺留項目需要照顧它自己的「字符串」,「矢量」等來維護時,這很有用。代碼帶有的信息越多越好。

+1

它沒有傷害,直到有你,因爲你指定的命名空間上明確地錯過了一個模板特殊化。我必須承認我也是這樣做的,但是從閱讀Meyer的「Effective C++」開始,我更加有意識地思考了這一點。 – paxos1977 2008-10-18 14:30:50

+0

這只是真正的問題,對我來說在實踐中最小和最大的問題,進一步通過MS頭部屠殺也做了#define分鐘和最大 – paulm 2014-09-05 19:28:16

4

我的一般規則總是明確地使用標題中的名稱空間,並且通常在代碼中使用。前者的原因是在定義的每個部分都明確地說明了正在使用的內容,後者的原因是如果必要的話,可以很容易地使用來自其他名稱空間的替換。即如果我們想要開始使用foo :: string而不是std :: string,我們只需要更新頭文件和using語句,而不是用代碼中的foo :: string替換std :: string的每個實例。

當然,對於駐留在std :: namespace中的類來說,這並不會有用,因爲即使您替換了一個類,仍然可能使用std中的其他類,並且可能會遇到模糊問題,但那是隻是一個例子。

19

額外的打字不是這裏的問題。顯式限定名稱的問題是視覺混亂。讓我們面對它,C++語法是不整潔的。沒有必要通過不必要地更長的名字和慷慨地使用:: s來噴碼。

我與傑夫阿特伍德:The Best Code is No Code At All。這是如此真實。

命名空間進口減少混亂,沒有缺點的好方法:只要打開命名空間的範圍縮小到一個單一的編譯單元,名稱衝突,他們應該會出現,可以很容易地解決。

爲什麼明確的名字應該(通常)更具可讀性一直是我的一個謎。讀者通常應該知道代碼足夠好,能夠推斷出語義。如果它們不是,代碼仍然需要修復。


1)推論:在標頭中沒有using

1

using在功能範圍,或者功能很小(通常是),就明確的命名空間

4

usingusing namespace是非常非常有用的渲染代碼更易讀 - 除去雜波。

但是,在任何情況下,如果它很難找出符號來自哪裏,我會拒絕導入它的整個名稱空間。

我嘗試limiit進口的命名空間的範圍:

void bar() { 

    // do stuff without vector 

    { using std::vector; 
     // do stuff with vector 
    } 

    // do stuff without vector 
} 

對於「一般稱爲」庫,例如std,我就敢用using namespace std。有理由相信讀這個代碼的每個人都知道這些符號。

作爲旁註,using關鍵字還用於指示派生類還導出其超類的重載成員。

class A { 
    void f(A ); 
    void f(bool); 
}; 

class B : public A { 
    using A::f; // without this, we get a compilation error in foo() 
    void f(bool); 
}; 

void foo() { 
    B b; 
    b.f(A()); // here's a compilation error when no `using` is used in B 
} 
2
使用std ::法院

我傾向於顯式導入,我需要在.cpp文件的頂部的名稱,所以......

; 使用std :: endl;

等等

這樣,我有超過我使用的名字控制和可以很容易地看到他們來自何處,代碼是不是在使用點混亂。

在極少數情況下,我使用來自不同命名空間的兩個名字,我完全限定了它們在使用時的位置。

我總是在標題中使用完全合格的名字,幾乎不使用「使用命名空間X」的任何地方......

相關問題