2011-03-09 27 views
2

我是編程初學者,我經常看到很多程序使用前綴std,如果他們使用的任何std功能,如std::cout,std::cin等我想知道它是什麼目的?這只是一種好的編程方式,還是更多的呢?它對編譯器有什麼區別,或者它是可讀性還是什麼?謝謝。什麼是指定「STD」前綴的需要?

+4

因爲你的程序將無法不把它編譯? – 2011-03-09 00:03:54

+2

另見:http://stackoverflow.com/questions/2218140/what-requires-me-to-declare-using-namespace-std – 2011-03-09 00:05:20

回答

10

的STL的類型和功能在名爲std的命名空間中定義。該std::前綴用於使用的類型,而完全包括std命名空間。

選項1(使用前綴)

#include <iostream> 

void Example() { 
    std::cout << "Hello World" << std::endl; 
} 

選項#2(使用的命名空間)

#include <iostream> 
using namespace std; 

void Example() { 
    cout << "Hello World" << endl; 
} 

選項#3(使用單獨的類型)

#include <iostream> 
using std::cout; 
using std::endl; 

void Example() { 
    cout << "Hello World" << endl; 
} 

注:有一種包括整個C++命名空間(選項#2)以外的不具有前綴每種類型/方法其他含義std::文件(特別是如果一個報頭內完成)。許多C++程序員避免這種做法,更喜歡#1或#3。

+1

@Erik那是另一種選擇我elluded來。我會明確指出 – JaredPar 2011-03-09 00:08:15

+0

我會指出,你不應該在頭文件中包含整個名稱空間。它也會包含在用戶的源代碼中(包括你的頭文件),這不是你想要的。 – 2011-03-09 00:21:04

+0

@Dadam,我的回答的最後一段指出它的#2不應該在頭 – JaredPar 2011-03-09 00:36:28

0

這是短期的標準命名空間。

你可以使用:

using namespace std 

,如果你不想使用std ::法院,以保持和只使用COUT

+0

我不同意這裏。 'std ::'優於'using namespace std'' – Tim 2011-03-09 00:09:40

+0

如果你「通常」使用它,請停止。見@埃裏克的答案。 – 2011-03-09 00:11:41

+0

好吧,「通常」不是正確的用詞。改變它意味着我的意思。 – Steve 2011-03-09 00:12:10

12

C++有命名空間的概念。

namespace foo { 
    int bar(); 
} 

namespace baz { 
    int bar(); 
} 

這兩個函數可以在沒有衝突的情況下共存,因爲它們位於不同的名稱空間中。

大部分的標準庫函數和類生活在「STD」命名空間。要訪問例如COUT,你需要做以下操作之一,按優先順序:

  • std::cout << 1;
  • using std::cout; cout << 1;
  • using namespace std; cout << 1;

你應該避免using理由證明上述foo和巴茲命名空間。如果您有任何using namespace foo; using namespace baz;試圖調用bar()將是不明確的。使用命名空間前綴是明確和詳細的,有良好的習慣。

1

這是一個C++特徵稱爲名稱空間:

namespace foo { 
    void a(); 
} 


// ... 

foo::a(); 

// or: 

using namespace foo; 
a(); // only works if there is only one definition of `a` in both `foo` and global scope! 

的優點是,可以存在名爲a多種功能 - 只要它們是不同的命名空間中的,它們可以被明確地使用(即foo::a()another_namespace::a() )。整個C++標準庫位於std用於這一目的。

使用using namespace std;避免前綴,如果你能忍受的缺點(名稱衝突,不太清楚其中的功能所屬的...)。

2

沒有人在他們的答案,一個using namespace foo語句可以在函數體內放提到的,從而減少了在其他範圍內的命名空間的污染。

例如:

// This scope not affected by using namespace statement below. 

void printRecord(...) 
{ 
    using namespace std; 
    // Frequent use of std::cout, io manipulators, etc... 
    // Constantly prefixing with std:: would be tedious here. 
} 

class Foo 
{ 
    // This scope not affected by using namespace statement above. 
}; 

int main() 
{ 
    // This scope not affected either. 
} 

你甚至可以把一個using namespace foo聲明局部範圍(對花括號)內。

相關問題