2012-05-04 134 views
0

我在我的代碼中使用了許多命名空間,包括std之一,所以當我想要在我的代碼中聲明一個字符串變量時,我應該精確地使用std :: string或者我只能放入字符串:std ::字符串vs字符串

#include <string.h> 

using namespace std; 
using namespace boost; 
using namespace xerces; 

int main() 
{ 
    /*! should I declare my str like this */ 
    std::string str; 
    /*! or I can declare it like this */ 
    string str1; 
    cout << str << str1 <<endl; 
    return 0; 
} 
+3

這是什麼'使用'是:) –

+7

'#include '不會給你'std :: string'聲明 –

+6

[爲什麼'using namespace std;'在C++中被認爲是不好的做法?](http://stackoverflow.com/a/1453605/140719) – sbi

回答

9

由於您有using namespace std;,因此名稱string的含義與std::string [*]相同。因此,這是一個你喜歡的風格問題(如果你喜歡std::string,那麼你可以忽略using namespace std;)。

std::boost::之間有一些名稱衝突,特別是對於在標準化之前在Boost中進行試驗的事件。因此,例如,如果您包含適當的標題,則存在std::shared_ptrboost::shared_ptr。他們可能會或可能不會提到相同的類型,我沒有檢查Boost是否在定義它自己之前嘗試檢測標準類型。

因此,同時使用stdboost名稱空間不一定是個好主意。您可以使用using std::string;的個人名稱,而不是整個名稱空間。

[*]如果std::string被定義,那麼它不是,因爲您沒有包含<string>

+1

ok我已經知道了,但是如果我需要在我的代碼中使用兩個名稱相同的兩個不同名稱空間的類(但當然不是相同的實現,假設我的代碼是交換類或類似的東西),所以我需要在我的被調用的類之前精確的命名空間名稱,但是一旦我做了,我不應該繼續這樣做,即使在其他使用過的名稱空間中沒有類似名稱的類? – Glolita

+1

@格洛麗塔:完全取決於你(或者你的老闆,如果你的老闆寫了你的風格指南)。僅僅因爲某些名稱不明確,因此需要名稱空間前綴,並不意味着您必須爲每個名稱都寫一個名稱空間前綴。如果你想編寫'string',並且它不與'string'的任何其他定義發生衝突,那麼首先要麼'使用名稱空間標準;'或'使用標準::字符串''。我更喜歡'使用std :: string;',因爲我不想導入很長的名字列表,其中一些名字我從來沒有聽說過,並且在未來的編譯器版本中可能會改變。 –

+1

哦好吧現在我明白了,非常感謝:) – Glolita

4

如果您使用using namespace std;,則只能使用string

在所有情況下添加using namespace std;可能都不是最好的主意,因爲在某些情況下它可能導致名稱空間之間的衝突(雖然對於string不適用)。

2

您正在使用命名空間std,因此您不需要將stringstd::相加,但您可以隨意選擇。

3

通常不需要它來指定std::string如果您已聲明using namespace std;作爲一般情況下,如果是包含具有相同名稱的不同類的多個命名空間,那麼你就會有下一個指定的命名空間的鍵入(namespace::type),無論是否存在using語句。

5

你可以只寫string。但如果boostxerces也有符號string?我建議不要使用這些using指令。這不僅僅是string可能會發生衝突。你基本上將大量符號拉入全局命名空間。如果你真的想避免輸入std::那麼你可以使用一個typedef:

typedef std::string MyStr; 
+4

或更糟糕的是:如果你輸入'strong',意思是輸入'std :: string'並且有一個'boost :: strong'? –

+0

@ R.MartinhoFernandes好點。或者如果你有一個模板化的'set'函數,就像我在最近看到的一個問題。 – juanchopanza

0

代碼的一個好方法是不使用頁眉任何相關的命名空間,以防止當暴露的#include的命名空間外。但是在編譯源代碼中,即使使用std命名空間並調用std :: string,也可以執行任何你想要的操作。有時甚至需要它(如果包含兩個定義相同字符串類的名稱空間)。