Namespaces and the Pre-Processor
我很难理解C++中的预处理器和命名空间。例如,考虑以下程序:
1 2 3 4 5 6 7 8 9 10
| #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和一些关于正在使用的名称空间的信息。
严格地说,你不需要using namespace std;它所做的只是让你写作。
1
| cout <<"Hello World!" << endl; |
而不是
1
| std::cout <<"Hello World!" << std::endl; |
命名空间"包含""IoSt流"定义(除了由标准C++库提供的其他定义之外),仅在EDCOX1"5"字元隐含地"前缀"到所有名称的意义上。此"包含"与"iostream文件包含输入/输出函数定义"中的"包含"不同:该文件字面上包含这些定义;std::命名空间名称只是一个前缀,可以避免名称冲突。
- 因此,如果我理解正确,iostream文件包含"cout"和"endl"的实际定义,而名称空间包含iostream定义以及其他定义。唯一的原因是要包括有关命名空间的信息(即用std::前缀或声明"using namespace std;")以避免名称冲突吗?如果已经包含了所有需要的定义(通过预处理器步骤),那么仍然需要提供关于名称空间的更多信息,这似乎有点奇怪。
- @为了避免混淆,我不会在名称空间中使用"contains"这个词。这里唯一真正的包含是"iostream包含了cout和endl的定义"。在iostream中,这些定义包含在std名称空间中。cout的"实名"(也称为"完全限定名")是std::cout。当抛出using指令时,编译器隐式地在std::前面加上非限定名(即没有作用域解析操作符::的名称),以解析它们的定义。不过,using完全是可选的。
- 另外,using namespace std;也是有问题的,因为它会污染名称空间,特别是当您包含更多的标准头时。(在一个函数中,它并不像在文件级别上那样糟糕,但我仍然认为这不是一个好主意,而且using std::cout;和using std::endl更好。
头文件包含多个有用事物的声明,包括变量std::cout和std::endl。
如果没有这些声明,编译器就不会知道您在编写cout << ...时所指的是什么。