头文件如何来关联源文件?

这个问题实际上是说,已知头文件“a.h”声明了一系列函数(仅有函数原型,没有函数实现),“b.cpp”中实现了这些函数,那么如果我想在“c.cpp”中使用“a.h”中声明的这些在“b.cpp”中实现的函数,通常都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎样找到b.cpp中的实现呢?

其实.cpp和.h文件名称没有任何直接关系,很多编译器都可以接受其他扩展名。
谭浩强老师的《C程序设计》一书中提到,编译器预处理时,要对#include命令进行“文件包含处理”:将headfile.h的全部内容复制到#include “headfile.h”处。
这也正说明了,为什么很多编译器并不care到底这个文件的后缀名是什么----因为#include预处理就是完成了一个“复制并插入代码”的工作。

程序编译的时候,并不会去找b.cpp文件中的函数实现,只有在link的时候才进行这个工作。我们在b.cpp或c.cpp中用#include “a.h”实际上是引入相关声明,使得编译可以通过,程序并不关心实现是在哪里,是怎么实现的。源文件编译后成生了目标文件(.o或.obj文件),目标文件中,这些函数和变量就视作一个个符号。在link的时候,需要在makefile里面说明需要连接哪个.o或.obj文件(在这里是b.cpp生成的.o或.obj文件),此时,连接器会去这个.o或.obj文件中找在b.cpp中实现的函数,再把他们build到makefile中指定的那个可以执行文件中。

在VC中,一帮情况下不需要自己写makefile,只需要将需要的文件都包括在project中,VC会自动帮你把makefile写好。
通常,编译器会在每个.o或.obj文件中都去找一下所需要的符号,而不是只在某个文件中找或者说找到一个就不找了。因此,如果在几个不同文件中实现了同一个函数,或者定义了同一个全局变量,链接的时候就会提示“redefined”.

代码在这里

代码结构
.
├── add.c
├── add_sub.h
├── main.c
├── Makefile
└── sub.c

Makefile

可以看出代码是被分别编译的,最后才被链接成一个整体,一个可执行文件 main
main: add.o sub.o main.ogcc add.o sub.o main.o -o mainadd.o: add.c add_sub.hgcc -c add.c -o add.osub.o: sub.c add_sub.hgcc -c sub.c -o sub.omain.o:main.c add_sub.hgcc -c main.c -o main.o
clean:rm -rf *.o main

c++ 头文件 .h 理解与实践相关推荐

  1. extern与头文件(*.h)的区别和联系

    原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...

  2. 单片机零基础入门(9-1)实战:模块化编程(模块化两个案例含源码--以及无法显示头文件(.h)的解决方案)

    单片机零基础入门(9-1)实战:模块化编程-(以及无法显示头文件(.h)的解决方案) 本文作为单片机零基础入门(8-5)模块化编程的拓展和补充,比前面的单片机零基础入门(8-5)模块化编程更为详细. ...

  3. C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题: 在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误 C2143    语法错误: 缺少")"(在"*"的前面) (编 ...

  4. C语言头文件深入理解

    C语言程序中,源文件通常分为两种:一种用于保存程序的声明(declaration),称为头文件:另一种用于保存程序的实现(implementation),称为定义(definition)文件. C程序 ...

  5. mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!

    在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...

  6. 个人学习之C++ 头文件.h与.cpp

    最近在学习的过程中发现这个问题,因为是学习所以内容对网上的内容有很多参考 在一个C++程序中,只包含两类文件--.cpp文件和.h文件. 一.初步了解 1.头文件的作用:  方便函数的统一的声明 2. ...

  7. 对上一篇文章《extern与头文件(*.h)的区别和联系》的学习体会

    阅读了上一篇分享的文章,我个人认为,最重要的结论如下: 总结: 对变量而言,如果你想在本源文件(例如文件名A)中使用另一个源文件(例如文件名B)的变量,方法有2种:(1)在A文件中必须用extern声 ...

  8. 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类

    之前没有用VS或者在vs中一个源程序写到底,没有使用C++编一个工程 打开VS2015 ,新建VS win32工程,前面步骤很简单,不再阐述 下面直接开始: 新建一个VC++ win32的程序, 在源 ...

  9. c头文件(.h)的作用

    C语言的著作中,至今还没发现把.h文件的用法写的透彻的.在实际应用中也只能依葫芦画瓢,只知其然不知其所以然,甚是郁闷!闲来无事,便将搜集网络的相关内容整理一下,以便加深自己的理解 理论概述: .h中一 ...

最新文章

  1. HDU_1087-Super Jumping! Jumping! Jumping!
  2. python while循环语句-python while循环控制流语句结构与用法
  3. epoll和select区别
  4. ylbtech-LanguageSamples-UserConversions(用户定义的转换)
  5. WeTool逆向:借用别人的成果 打造自己的程序
  6. Linux之xargs
  7. Python中enumerate函数的解释和可视化
  8. 商业逻辑12讲之战略管理的逻辑
  9. Android--快速接入微信支付
  10. Python通过LDAP验证、查找用户(class,logging)
  11. ios 高德挪动地图获取经纬度_高德地图获取地理位置经纬度并将经维度转化为详细地址信息...
  12. Jquery网页元素里面的操作以及JSON
  13. 比特币与莱特币的区别
  14. 【渝粤教育】国家开放大学2019年春季 1349学前教育科研方法 参考试题
  15. swift 全局常量 全局变量的写法
  16. 利用TestDriven.net和NUnit进行单元测试(转)
  17. VGG-16网络结构详解
  18. spss数据统计分析工具IBM SPSS Statistics 26 for Mac安装教程
  19. java实现在线预览的功能(一)word转html
  20. 用amCharts插件实现树状图

热门文章

  1. Oracle Database 12c DBA文官手册(第8版)——第5章 开发和实现应用程序
  2. 使用Hexo+ github快速搭建自己的博客网站(一)
  3. Android 插件化总结
  4. [Java 安全]加密算法
  5. txt文件分解为固定条数的文件
  6. 开源项目_可能使用到的开源项目集合
  7. 在 Linux 系统中安装Load Generator ,并在windows 调用
  8. 脊柱外科病人资料管理系统的界面设计分析
  9. nginx+fastcgi+c/c++搭建高性能Web框架
  10. 图书大甩卖(操作系统、C语言、Linux) 已成交