C++ 命名空间和包含

标签 c++ namespaces header-files

为什么我们都需要using namespaceinclude C++ 程序中的指令?

例如,

#include <iostream>

using namespace std;

int main() {
 cout << "Hello world";
}

为什么只有 #include <iostream> 还不够或者只是有using namespace std并摆脱另一个?

(我正在考虑与 Java 进行类比,其中 import java.net.* 将从 java.net 导入所有内容,您无需执行任何其他操作。)

最佳答案

using 指令和 include 预处理器指令是两个不同的东西。 include大致对应CLASSPATH Java 的环境变量,或 -cp java虚拟机的选项。

它的作用是让编译器知道类型。仅包括 <string>例如,您可以引用 std::string :

#include <string>
#include <iostream>

int main() {
    std::cout << std::string("hello, i'm a string");
}

现在,使用指令就像 import在 java 。它们使名称在它们出现的范围内可见,因此您不必再完全限定它们。就像在 Java 中一样,必须知道使用的名称才能使其可见:

#include <string> // CLASSPATH, or -cp
#include <iostream>

// without import in java you would have to type java.lang.String . 
// note it happens that java has a special rule to import java.lang.* 
// automatically. but that doesn't happen for other packages 
// (java.net for example). But for simplicity, i'm just using java.lang here.
using std::string; // import java.lang.String; 
using namespace std; // import java.lang.*;

int main() {
    cout << string("hello, i'm a string");
}

在头文件中使用 using 指令是一种不好的做法,因为这意味着碰巧包含它的每个其他源文件都会使用非限定名称查找来查看这些名称。与在 Java 中,您只使名称对出现导入行的包可见,而在 C++ 中,如果它们直接或间接包含该文件,它会影响整个程序。

在全局范围内执行此操作时要小心,即使在实现文件中也是如此。最好尽可能在本地使用它们。对于命名空间 std,我从不使用它。我和其他许多人总是写 std::在名字前面。但如果你碰巧这样做了,就这样做吧:

#include <string>
#include <iostream>

int main() {
    using namespace std;
    cout << string("hello, i'm a string");
}

关于命名空间是什么以及为什么需要它们,请阅读 Bjarne Stroustrup 在 1993 年提出的将它们添加到即将到来的 C++ 标准中的提案。写的很好:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0262.pdf

关于C++ 命名空间和包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/389922/

相关文章:

c++ - Linux 上的 C++ 在一行上打印 5000 个 float 时换行

c++ - 使用 DevIL 从图像中检索的像素数据

c++ - 在平台之间移植 CRC 查找表?

c++ - 友商混淆

c++ - 是否会调用析构函数,如果是,那么由于哪个 vector ?

c# - 命名空间、别名和 Visual Studio Forms Designer

c# - 命名空间:使用 System 和使用 System.IO

python - 赋值只是将名称绑定(bind)到对象?

c++ - 我如何删除带有指针子节点的类节点

c++ - 如何避免到处链接某个目标文件