C++的#include和using namespace

补一点C++最最基础的东西,翻译自:stackoverflow的回答

第一个回答

为了说清楚这个问题,首先要了解一些C和C++的基础。

在编译C/C++时,将源文件编译为可执行文件实际上需要两个步骤:编译和链接。编译一次接受一个.cpp文件并且编译它,其它的.cpp文件对编译器来说是不可见的,这会生成一个目标文件。然后,编译器链接所有的目标文件以生成最终的可执行文件。

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

1 void Foo();

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

定义指定了这个函数的功能。下面是这个函数的定义:

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

接下来定义另一个函数Bar():

1 void Bar()  {
2     Foo();
3     cout<<"bar";
4 }

这个函数调用了函数Foo()。如果函数foo之前没有在同一个文件中进行声明或定义,那么这个函数不能被编译成功。因此声明本身不产生任何编译代码,它们只需要待在那里。

如果函数Foo()没有在此文件中进行定义,而是在另一个文件中进行了定义,那么链接器的作用就是在两个函数之间建立链接。如果Foo()函数没有在任何地方进行定义,那么就会得到一个链接错误,而不是一个编译错误。

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

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

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

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

第二个回答(转自:路人甲JIA

例如:你有一个向量类vector.h,则把它加入到project中。vector是标准库STD中的一部分,因此可以使用以下语句来进入向量类:

1 std::vector

  然而,如果程序员由于懒而不想在所有地方写std::(标准库有非常多有用的地方),则可以在.cpp文件的顶部写:

1 using namespace std

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

1 std::vector
2 vector

  在vector.h中,会看到类似于下面的语句:

1 namespace std
2 {
3     class vector { /* Implementation */ }
4 }

  因此,#include是用于添加文件,而using namespace用于保持代码结构整洁干净,并将其打包在“有意义”的库中。当你编程时可以省略using namespace,但绝对需要使用#include。

posted @ 2018-07-02 10:52  taolusi  阅读(2125)  评论(0编辑  收藏  举报