命名空间和预处理器

时间:2013-02-10 00:14:28

标签: c++ compiler-construction

我在理解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 个答案:

答案 0 :(得分:2)

严格来说,你不需要using namespace std;所有这一切都是让你写的

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

而不是

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

命名空间“包含”iostream定义(在标准C ++库提供的其他定义中)仅在std::隐含地“加上”所有名称的前缀的意义上。这个“包含”不同于“iostream文件包含输入/输出函数定义”中的“包含”:文件字面上包含定义; std::命名空间名称只是一个允许您避免名称冲突的前缀。

答案 1 :(得分:1)

标题文件<iostream>包含几个有用内容的声明,包括变量std::coutstd::endl

如果没有这些声明,编译器在编写cout << ...时就不会知道你所指的是什么。