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

 更新时间:2012年11月26日 16:25:07   作者:  
特别是对源文件和头文件的概念,需要深入对它了解,本文将详细介绍,需要了解的朋友可以参考下

因刚接触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,外部链接(这个是默认情况),那么根据在同一个程序内不可出现
同名函数的要求,连接器会毫不留情给你一个连接错误!

相关文章

  • C语言实现点菜系统

    C语言实现点菜系统

    这篇文章主要为大家详细介绍了C语言实现点菜系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++任意线程通过hwnd实现将操作发送到UI线程执行

    C++任意线程通过hwnd实现将操作发送到UI线程执行

    做Windows界面开发时,经常需要在多线程环境中将操作抛到主线程执行,下面我们就来学习一下如何在不需要重新定义消息以及接收消息的情况下实现这一要求,感兴趣的可以了解下
    2024-03-03
  • AVX2指令集优化浮点数组求和算法

    AVX2指令集优化浮点数组求和算法

    这篇文章主要为大家介绍了AVX2指令集优化浮点数组求和算法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Opencv下载和导入Visual studio2022的实现步骤

    Opencv下载和导入Visual studio2022的实现步骤

    本文主要介绍了Opencv下载和导入Visual studio2022的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言自定义类型详解(结构体、枚举、联合体和位段)

    C语言自定义类型详解(结构体、枚举、联合体和位段)

    这篇文章主要给大家介绍了关于C语言中结构体、枚举、联合体和位段自定义类型的相关资料,分别介绍了结构体、枚举、联合体和位段等四种自定义类型,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • 纯C语言实现火车售票系统

    纯C语言实现火车售票系统

    这篇文章主要为大家详细介绍了纯C语言实现火车售票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • c++中c_str()的用法示例

    c++中c_str()的用法示例

    这篇文章主要介绍了c++中c_str()的用法示例,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-09-09
  • C/C++中getline函数案例总结

    C/C++中getline函数案例总结

    这篇文章主要介绍了C/C++中getline函数案例总结,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 探究在C++程序并发时保护共享数据的问题

    探究在C++程序并发时保护共享数据的问题

    这篇文章主要介绍了探究在C++程序并发时保护共享数据的问题,也有利于大家更好地理解C++多线程的一些机制,需要的朋友可以参考下
    2015-07-07
  • C语言的常量,字符串,转义字符,注释你都了解吗

    C语言的常量,字符串,转义字符,注释你都了解吗

    这篇文章主要为大家详细介绍了C语言的常量,字符串,转义字符,注释,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02

最新评论