我在理解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和一些關於正在使用的命名空間的信息。
因此,如果我正確理解你,iostream文件包含「cout」和「endl」的實際定義,而命名空間包含iostream定義以及其他定義。是否僅僅包含關於名稱空間的信息(例如,用std ::加前綴或者用「namespace std;」來表示)來避免名稱衝突?你需要的所有定義似乎有點奇怪(通過預處理器步驟),你仍然需要提供更多關於命名空間的信息 – Ockham 2013-02-10 00:27:10
@Ockham我不會使用「contains」這個詞來避免命名空間混亂。這裏唯一真正的遏制是「iostream包含'cout'和'endl'的定義。」在iostream內部,這些定義被封裝在'std'命名空間中。 'cout'的「真名」(也稱爲「完全限定名稱」)是'std :: cout'。當你使用'using'指令時,編譯器會隱式地將'std ::'前綴到*非限定*名稱(即沒有作用域解析運算符'::的名稱)來解析它們的定義。雖然'使用'是完全可選的。 – dasblinkenlight 2013-02-10 00:43:37
另外,'using namespace std;'是有問題的,因爲它會污染名稱空間,尤其是一旦包含更多的標準頭文件。 (它在函數內並沒有像在文件級別那樣糟糕,但我仍然認爲這不是個好主意,並且使用std :: cout;',使用std :: endl'更好。 – us2012 2013-02-10 00:51:26