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。