c++ - 命名空间和预处理器

标签 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 和一些关于正在使用的命名空间的信息。

最佳答案

严格来说,你不需要using namespace std;它所做的只是让你写

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

代替

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

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

关于c++ - 命名空间和预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14793162/

相关文章:

C++ - 使用 live555 库的带有 Qt GUI 的 RTSP 客户端我还需要什么?

c# - DSL:从 DSL 规则到 C# 表达式

compiler-construction - 绑定(bind) LLVM 3.8.4 no getGlobalContext

pointers - 标记和清除垃圾收集中的指针反转会给您带来什么?

C++11 原子。为什么这个编译,而不是链接?

c++ - 排序获取最大数

C++ 传递对象的速度有多快?

C++ MiniMax算法陷入井字棋板的无限循环

java - 使用 Jar 从文件创建类

java - 在网络驱动器上编译java代码时出现问题,它以小写形式创建类文件