C++命名空间和include

dul*_*uli 32 c++ namespaces header-files

为什么我们需要在C++程序中使用namespace和include指令?

例如,

#include <iostream>

using namespace std;

int main() {
 cout << "Hello world";
}
Run Code Online (Sandbox Code Playgroud)

为什么只有#include或者只是使用"使用命名空间std"并摆脱另一个?

(我想到了与Java的类比,import java.net.*将从java.net导入导入所有东西,你不需要做任何其他事情.)

Joh*_*itb 39

using指令和包含预处理程序指令是两回事.的include大致对应于CLASSPATH爪哇的环境变量,或所述-cpjava虚拟机的选项.

它的作用是使编译器知道类型.仅包括<string>例如将使您能够参考std::string:

#include <string>
#include <iostream>

int main() {
    std::cout << std::string("hello, i'm a string");
}
Run Code Online (Sandbox Code Playgroud)

现在,使用指令就像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");
}
Run Code Online (Sandbox Code Playgroud)

在头文件中使用using指令是不好的做法,因为这意味着恰好包含它的每个其他源文件将使用非限定名称查找来查看这些名称.与Java不同,在Java中只显示包的名称,导入行显示在C++中,如果它们直接或间接包含该文件,它可以影响整个程序.

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

#include <string>
#include <iostream>

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

对于什么名称空间以及为什么需要它们,请阅读Bjarne Stroustrup给出的提议,将它们添加到即将到来的C++标准中.写得很好:

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

  • 这是一个比我上面更好的答案. (2认同)

Tim*_*Tim 30

C++概念是分开的.这是设计和有用的.

您可以包含没有名称空间的内容.

使用命名空间,您可以引用具有相同名称的两个不同的类.当然,在这种情况下你不会使用该using指令,或者如果你这样做,你必须在你想要的命名空间中指定其他东西的命名空间.

另请注意,您不需要使用 - 您可以使用std :: cout或您需要访问的任何内容.您使用命名空间为项添加前缀.


Mot*_*tti 9

在C++中#include使用具有不同的功能.

#include将包含文件的文本放入源文件(实际上是翻译单元),另一方面,命名空间只是一种具有唯一名称的机制,以便不同的人可以创建"foo"对象.

这来自C++没有模块的概念.

请记住,C++中的命名空间是开放的,这意味着不同的文件可以定义同一命名空间的不同部分(有点像.NET的部分类).

//a.h
namespace eg {
    void foo();
}

//b.h
namespace eg {
    void bar();
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ran 6

包含是定义函数的存在.

使用使它更容易使用.

cout 在iostream中定义的实际上名为"std :: cout".

您可以通过编写来避免使用命名空间.

std::cout << "Hello World";
Run Code Online (Sandbox Code Playgroud)