2011-02-24 69 views
17

在C++中,#include指令和using namespace之间有什么区别?你也将你的名字空间存储为单独的文件,这些文件的文件扩展名是什么?C++:using namespace and #include

+0

C中没有名称空间,只改为C++。 – 2011-02-25 17:37:43

回答

22

为了回答你的问题,我会稍微回过头来看看C和C++的一些基础知识。

编译C/C++时,将源文件编译成实际的可执行文件实际上是两个步骤,即编译和链接。编译步骤一次只接受一个.cpp文件并编译。其他.cpp文件的内容对编译器不可见。这会生成一个“目标文件”(我不知道为什么这样称呼它)。所有的目标文件然后通过链接器链接以产生最终的可执行文件。

这带来了C++中两个重要的概念,声明和定义。声明指定某处(变量或函数)将存在于某处。以下是函数foo()的声明

void Foo(); 

这意味着我们已经告诉编译器的地方会有一个函数foo(),它没有参数,没有返回值。

定义指定了函数的实际功能。这里定义函数

void Foo() { cout << "Foo!!"; } 

让我们定义另一个函数,酒吧()

void Bar() { 
    Foo(); 
    cout << "bar"; 
} 

此函数调用函数foo()。如果函数foo尚未在同一个文件中声明或定义,则无法编译此函数。所以声明本身不会产生任何编译代码。他们必须在那里。

如果函数Foo()没有在这个文件中定义,而是一个不同的.cpp文件,那么链接器的工作就是在这两个函数之间建立连接。如果函数Foo()没有在任何地方定义,你将会得到一个链接器错误,而不是编译器错误。

这涉及头文件的概念。头文件是您存储声明的地方。当使用#include包含头文件的内容时,实际发生的情况是预处理器(在实际编译器之前执行的一个步骤)将加载包含的文件并将内容“粘贴”到原始源文件中。所以编译器会看到文件,就好像整个头文件实际上被粘贴到C++文件中一样。

所以,当你在C++编程,你通常会放在.cpp文件的定义,你就会把你的声明.h文件中,另一方面

命名空间是一个简单的方法进行逻辑分组代码。

因此,不,名称空间不存储在单独的文件中,并且它们没有特定的文件扩展名。如果我有一个具有多个名称空间的项目,我可能会为每个名称空间创建一个单独的目录(然后再次,我可能不会,这取决于情况)。

34

在C++中,#include用于将文件添加到您的项目,而namespace是用来保持在逻辑模块的对象(命名空间并不适用于C)

例如,你可能在文件中的向量类“vector.h”,所以你把它包含在你的项目中。

向量是一个大型图书馆(标准库)STD的一部分,这样你就可以

std::vector 

但是由于程序员的懒惰,不想写的std ::遍布访问(标准库有许多非常有用的部分),您可以在文件顶部写上

using namespace std 

。这将告诉编译器,每次它看到一个类型(比如向量)时,还要检查命名空间std,因为定义可能在那里。这样,以下声明就变得相当了。

std::vector 
vector 

在vector.h,你应该看到类似

namespace std 
{ 
    class vector { /* Implementation */ } 
} 

所以#include是添加文件,而using namespace是让你的代码更清洁和包装“有意义”的图书馆。编程时你可以省略using namespace,但绝对需要#include

相关问题