C ++:使用命名空间和#include

时间:2011-02-24 23:48:05

标签: c++

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

2 个答案:

答案 0 :(得分:35)

在C ++中,#include用于向项目添加文件,而namespace用于将对象保存在逻辑模块中(命名空间不适用于C)

例如,您可能在文件“vector.h”中有一个矢量类,因此您将其包含在项目中。

vector是大型库(标准库)STD的一部分,因此您可以使用

访问它
std::vector

然而,由于程序员很懒,而且不想写std :: all(标准库有许多非常有用的部分),你可以编写

using namespace std

位于文件顶部。这将告诉编译器每次看到类型(例如向量)时,也要检查命名空间std,因为定义可能在那里。这样,以下陈述就等同了。

std::vector
vector

在vector.h中,您应该看到类似

的内容
namespace std
{
   class vector { /* Implementation */ }
}

所以#include是添加文件,而using namespace是为了让你的代码更清洁并打包在“有意义的”库中。您可以在编程时省略using namespace,但绝对需要#include

答案 1 :(得分:26)

为了回答你的问题,我会稍微回顾一下C和C ++的基础知识。

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

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

的声明
void Foo();

这意味着我们告诉编译器某个地方会有一个函数Foo(),它不带参数并且不返回任何值。

一个定义指定了实际执行的功能。这里定义了函数

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

让我们定义另一个函数Bar()

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

此函数调用函数Foo()。如果函数foo之前尚未在同一文件中声明或定义,则无法编译此函数。因此声明本身不产生任何编译代码。他们只需要在那里。

如果函数Foo()没有在此文件中定义,而是在另一个.cpp文件中定义,则链接器的作用是在这两个函数之间建立连接。如果函数Foo()没有在任何地方定义,则会出现链接器错误,而不是编译器错误。

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

因此,当您使用C ++编程时,通常会将您的定义放在.cpp文件中,并将声明放在.h文件中

另一方面,命名空间只是一种逻辑分组代码的方法。

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