zoukankan      html  css  js  c++  java
  • .h和.cpp文件的区别

    关于头文件和源文件的分别

    首先,我们可以将所有东西都放在一个.cpp文件内.

    然后编译器就将这个.cpp编译成.obj,obj是什么东西?

    就是编译单元了.一个程序,可以由一个编译单元组成,

    也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,

    就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上

    就可以分别放在一个单元,也就是cpp里面)

        那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),

    组成一个.exe,也就是程序了.

        如果一个.cpp要用到另一个.cpp定义的函数怎么办? 只需在这个.cpp种写上他的函数声明

    就可以了.其余工作由链接器帮你完成,你可以随便调用该函数.

        链接器将所有的obj连接起来,但是如果碰巧有相同的函数或外部变量怎么办?他如何识别?

    一般来说是不能允许在同一个程序中,出现两个一样的函数名或外部变量名.

        但是只得庆幸的是,c++可以通过一种叫做链接属性的关键字来限定,你这个函数是属于整个程序

    公用的,还是只是在一个编译单元obj里面使用的.

        这些关键字就是extern 和 static; extern是外部链接的意思,也就是除了这个单元,外部的单元

    也是能够访问这个函数的.static 是内部链接,自属于自己单元.

    说了这么久,还没有说.h的作用呢?

        其实没有.h也能很好的工作,但是当你发现一个外部链接的函数或外部变量,需要许多份

    声明,因为c++这种语言,在使用函数和变量的时候,必须将他声明,为何要声明?声明之后才

    知道他的规格,才能更好的发现不和规格的部分.你别妄想一个编译单元,会自动从另一个

    编译单元那里得到什么信息,知道你是如何定义这个函数的.

        所以说,只要使用到该函数的单元,就必须写一份声明在那个.cpp里面,这样是不是很麻烦,

    而且,如果要修改,就必须一个一个修改.这真让人受不了.


    .h就是为了解决这个问题而诞生,他包含了这些公共的东西.然后所有需要使用该函数的.cpp,只需要

    用#include包含进去便可.以后需要修改,也只是修改一份内容.


    请注意不要滥用.h,.h里面不要写代码,.h不是.cpp的仓库,什么都塞到里面.

    如果在里面写代码,当其他.cpp包含他的时候,就会出现重复定义的情况,

    比如将函数func(){printf};放到头文件a.h,里面还有一些a.cpp需要的声明等;

    然后你发现b.cpp需要用到a.cpp里面的一个函数,就很高兴的将a.h包含进来.

    注意,#include并不是什么申请指令,他就是将指定的文件的内容,原封不动的拷贝

    进来.


    这时候实际上a.cpp和b.cpp都有一个func()函数的定义.

    如果这个函数是内部链接static的话,还好,浪费了一倍空间;

    如果是extern,外部链接(这个是默认情况),那么根据在同一个程序内不可出现

    同名函数的要求,连接器会毫不留情给你一个连接错误!

     

  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/shelvenn/p/1062446.html
Copyright © 2011-2022 走看看