答案

#include预处理实际上就是完成了一个“复制代码并插入”的工作!

编译器工作阶段

1.预处理
2.词法和语法分析
3.编译(高级语言——汇编语言——二进制码——目标文件.obj)
4.连接(生成可执行文件.exe)

编译器各阶段工作工作过程

1.预处理阶段:
编译器以C文件作为一个单元,开始读C文件,读到包含头文件的语句时,从所有搜索路径寻找头文件。
找到后,处理宏,变量,函数声明,检测依赖关系,进行宏替换,检查是否有重定义和声明,最后将头文件中的东西扫描进当前C文件中,形成“中间C文件”。
2.编译阶段
将各个函数编译成二进制码,按照特定格式生成目标文件.obj
3连接阶段
将各个目标文件,连接最终生成可执行文件

为什么在头文件进行函数,变量和宏的声明,而在C文件进行变量定义,函数实现?

1.在头文件实现函数体的话,如果在多个C文件中引用,且同时编译多个C文件,那么在连接成可执行文件时,如果这段函数没有定义成局部函数,就会出现函数的多重定义错误

2.如果在头文件定义全局变量,并且赋初值。那么多个引用此头文件的C文件中存在相同变量名的copy,由于已经赋初值,所以每个copy都会分配一个空间,那么在最终连接阶段,会在DATA段存在多个相同变量;假设没有赋初值,则编译器会将这个变量放在BSS段,连接器对BSS段的多个同名变量仅分配一个存储空间。

3.如果在C文件中声明宏,结构体,函数等,那么在另一个C文件中引用相同的宏,结构体,就必须再做重复工作。且改动时需要分别都改动,不如放在头文件中统一改动。

4.在头文件中声明结构,函数等,当想把代码封装成库,又不想开源时,可以在头文件中写函数声明和用法。

5.使用头文件还可以避免函数的声明和定义的次序问题

静态链接和动态链接

静态链接 :.h+.lib(编译器将.cpp文件编译成.lib库文件,接口对外,实现代码不可见)
动态链接:.h+.cpp

C语言中头文件和源文件的关系相关推荐

  1. 什么是c 语言中源文件,C++中头文件和源文件详细介绍

    C++中的头文件和源文件详解 一.C++编译模式 通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称 ...

  2. C语言中头文件和源文件的注意事项

    C语言中头文件和源文件的注意事项 文章目录 C语言中头文件和源文件的注意事项 0.前言 1.实现步骤 1.1 拆分前 1.2 拆分后 2.总结 2.1头文件内容 2.2 源文件(.c)内容 2.3 函 ...

  3. c语言头文件和源文件为什么分开,C语言中为什么要头文件和源文件分开写

    对c&c++程序来说,基本上来说都是要把源文件和头文件分别编写.一般都是代表一个基本功能的源文件引用相应的头文件. 一个 相关功能的模块可能有若干对源文件和头文件组成.这是基于组件编程的核心. ...

  4. C++ 笔记(25)— 理解 C++ 中的头文件和源文件的作用

    1. C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件: .cpp 文件,被称作 C++ 源文件,里面放的都是 C++ 的源代码 .h 文件,被称作 C++ 头文件,里面放的也是 C++ ...

  5. 详解C语言中头文件的作用

    大家好,先做个自我介绍,我是天蓬,欢迎阅读本篇博文. 由于本人理解能力不是很好,阅读他人文章时,常常看得晕头晕脑,这让我很是头疼,我想,世界上一定还有和我一样的人(哈哈,不是说你么笨哦).所以,我将会 ...

  6. C语言头文件和源文件差异,#include两种引用方式差异

    一些初学c语言的人,不知道头文件(*.h文件)原来还可以自己写的.只知道调用系统库函数时,要使用#include语句将某些头文件包含进去.其实,头文件跟.c文件一样,是可以自己写的.头文件是一种文本文 ...

  7. C++中的头文件和源文件:如何写头文件

    C++中的头文件和源文件 转自:博客园http://www.cnblogs.com/lidabo/archive/2012/04/17/2454568.html 一.C++编译模式 通常,在一个C++ ...

  8. C++中头文件和源文件详细介绍

    C++中的头文件和源文件详解 一.C++编译模式 通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称 ...

  9. 理解 C++ 中的头文件和源文件的作用

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件-- .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...

  10. C++中的头文件和源文件

    一.C++编译模式 通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C ...

最新文章

  1. 状态机系列学习笔记01
  2. python程序实例教程基础-编程小案例
  3. Java线程(二):线程同步synchronized和volatile
  4. python爬虫网络请求超时是什么意思_python爬虫怎么处理异常和超时?
  5. Django的ModelForm
  6. api过滤器_了解播放过滤器API
  7. Java线程—如何解决Swing的单线程问题-----------Swing线程机制
  8. 小红书如何实现高效推荐?解密背后的大数据计算平台架构
  9. 动手设计 CPU(一)—— 各类元件功能表
  10. CMU 15-213 Introduction to Computer Systems学习笔记(22) Synchronization: Advanced
  11. 产品选型“神器” TIA Selection Tools 之选择 S7-1500T 全程详解
  12. android搜狗离线安装包,搜狗翻译离线版下载
  13. 浏览器主页被篡改怎么办
  14. 师太、老衲、贫道的爱恨全集
  15. Ibeacon一维小项目
  16. 学之思开源考试系统 - 数据库设计文档
  17. c语言处理nc程序,NC程序的语言问题
  18. Al-learing数学基础,平均差,方差,协方差
  19. Flutter 设置 App 的主色调与字体
  20. 8000字34张图史诗级介绍同轴电缆、双绞线、光纤等线缆,超级详细!

热门文章

  1. 用Flutter实现一个类似于轮播图的效果
  2. 安装打印机驱动程序的操作步骤,详细方法介绍
  3. 计算机电源12v升高的原因,数值决定一切 解析PC电源+12V的“秘密”
  4. [Ps]制作菱形炫酷渐变背景
  5. Flutter 图片保存到本地
  6. 计算机英语怎么写怎么读,英语数字怎么读法
  7. Django项目实践(爬取今日头条的头条热榜)
  8. c# 异常(exception)
  9. 前端面试题+答案(Vue篇)
  10. 毕业设计 - 题目:基于python的验证码识别 - 机器视觉 验证码识别