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。

优质内容筛选与推荐>>
1、.NET专业词汇[英中]对照表(转)
2、centOS7 安装nginx
3、phprpc Can't find the key for decryption 解决方案
4、[转载精品]C++程序员经常问的11个问题
5、在Linux下删除文件及文件夹(rm)


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn