2013-02-10 77 views
1

我在理解C++中的預處理器和命名空間時遇到了一些麻煩。例如,考慮下面的程序:命名空間和預處理器

#include <iostream> 

int main() 
{ 
    using namespace std; 

    cout << "Hello World!" << endl; 

    return 0; 
} 

因此,當該程序正在準備進行編譯,預處理器將識別#include指令和iostream的文件添加到程序,使程序將I/O能力(即「cout」和「endl」)。現在根據我的教科書,作爲C++編譯器標準組件的類,函數和變量放置在命名空間std中。

這是令人困惑的,因爲如果標準函數(「cout」和「endl」)放在這個命名空間中,iostream的目的是什麼?我基本上試圖理解爲什麼我們需要iostream和一些關於正在使用的命名空間的信息。

回答

2

嚴格地說,你不需要using namespace std;它所做的就是讓你寫

cout << "Hello World!" << endl; 

,而不是

std::cout << "Hello World!" << std::endl; 

命名空間「含有」 iostream的定義(按標準提供的其他定義中C++庫),只是在std::隱含地「前綴」到所有名稱的意義上。 「包含」與「iostream文件包含輸入/輸出函數的定義」中的「包含」不同:文件實際上包含定義;命名空間名稱只是一個前綴,可以避免名稱衝突。

+0

因此,如果我正確理解你,iostream文件包含「cout」和「endl」的實際定義,而命名空間包含iostream定義以及其他定義。是否僅僅包含關於名稱空間的信息(例如,用std ::加前綴或者用「namespace std;」來表示)來避免名稱衝突?你需要的所有定義似乎有點奇怪(通過預處理器步驟),你仍然需要提供更多關於命名空間的信息 – Ockham 2013-02-10 00:27:10

+1

@Ockham我不會使用「contains」這個詞來避免命名空間混亂。這裏唯一真正的遏制是「iostream包含'cout'和'endl'的定義。」在iostream內部,這些定義被封裝在'std'命名空間中。 'cout'的「真名」(也稱爲「完全限定名稱」)是'std :: cout'。當你使用'using'指令時,編譯器會隱式地將'std ::'前綴到*非限定*名稱(即沒有作用域解析運算符'::的名稱)來解析它們的定義。雖然'使用'是完全可選的。 – dasblinkenlight 2013-02-10 00:43:37

+0

另外,'using namespace std;'是有問題的,因爲它會污染名稱空間,尤其是一旦包含更多的標準頭文件。 (它在函數內並沒有像在文件級別那樣糟糕,但我仍然認爲這不是個好主意,並且使用std :: cout;',使用std :: endl'更好。 – us2012 2013-02-10 00:51:26

1

頭文件<iostream>包括幾個有用的東西的聲明,包括變量std::coutstd::endl

如果沒有這些聲明,當您編寫cout << ...時,編譯器不會知道您指的是什麼。