当前位置:  编程技术>c/c++/嵌入式

.h和.cpp文件的区别(zt)详细介绍

    来源: 互联网  发布时间:2014-10-11

    本文导语:  因刚接触VC++的开发,需要对C++一些原理性的东西进行掌握。特别是对源文件和头文件的概念,需要深入对它了解: 关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,...

因刚接触VC++的开发,需要对C++一些原理性的东西进行掌握。特别是对源文件和头文件的概念,需要深入对它了解:
关于头文件和源文件的分别
首先,我们可以将所有东西都放在一个.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,外部链接(这个是默认情况),那么根据在同一个程序内不可出现
同名函数的要求,连接器会毫不留情给你一个连接错误!


    
 
 

您可能感兴趣的文章:

  • vim生成的.cpp~是什么文件?我使用vim编辑的时候出现了好多.cpp~文件
  • 编译一个hello.cpp文件后 ,再list ,怎么会多了个hello.cpp~文件?
  • 请问:对于目标文件的编译中,有a.h, b.h, c.h, a.cpp, b.cpp, c.cpp中,a.h中include 了b.h, c.h
  • .c文件与.cpp文件怎么混合编译哦....
  • 求一个命令或脚本,删除多个多级文件夹下指定格式(*.cpp)外的其他文件
  • 自动生成makefile的问题, C文件成功,但CPP文件失败,请指点.谢谢.
  • 请问如何在linux下一个工程里面使用多个cpp文件
  • linux如何查找多个目录下的cpp文件
  • 请问emacs中怎样用make来编译.cpp文件?
  • _ts.cpp文件
  • g++ -o file *.cpp iis7站长之家
  • Linux用什么命令建立一个.cpp文件?
  • 用uic工具生成的.h和.cpp文件为空?
  • Linux用什么命令编译执行.cpp文件
  • .c和.cpp的文件怎么一起编译啊
  • ubuntu下的.cpp,.h文件没法保存中文(从xp下面复制过来的源文件)
  • cpp文件如何自动生成Makefile文件
  • sco下用gcc编译hello.cpp出来的可执行文件居然有2800280字节,而且运行出错???
  • 对cpp源码打了patch之后,文件打不开了是咋回事?
  • 如何把某个目录下所有的cpp 、 c文件tar打包?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • g++ -o file *.cpp
  • Ruby中文分词器 rmmseg-cpp
  • Java到C++的转换工具 J2cpp
  • UML模型插件 Cpp2Uml
  • ActiveMQ-CPP
  • acl 扩展库 acl_cpp
  • 网络编程库 cpp-netlib
  • C/C++源码工具 cpp2html
  • JsonRpc-Cpp
  • PROC开发时 //注释编译不通过 如何设置使用cpp编译。
  • 源代码有.c和.cpp,链接时出错
  • linux下安装程序/lib/cpp问题
  • 在vim里怎样才能达到g++ foo.cpp -o foo的效果?
  • GCC 编译Cpp的问题。
  • C++国际化 UTF-8 CPP
  • debian下编译一个含 ifstream 的cpp程序
  • 我想在DOS下用TURBOC2.0编译一段.CPP(其中无类等),请问高手可以吗?
  • 请教如何在qt-linux环境下两个cpp文件中对同一个数组作读写互斥操作?
  • touch XX.h; cpp -dM XX.h
  • 关于.cpp和.c的混合编程


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3