C/C++的编译/链接模型与头文件

关于头文件,源文件,主源文件设计思想:

头文件主要用于变量,函数,类,模板等的声明,定义封装接口
源文件主要用于类方法,函数,模板方法等的实现,隐藏实现细节
主源文件主要用于使用各种接口。
头文件中定义各种接口
而源文件负责实现接口,需要添加头文
而主程序需要使用各种接口,需要添加头文件
其中头文件和源文件的前缀应该尽可能保持一致

C/C++的编译/链接模型

来自网络

预处理

——将源文件转换为翻译单元(单个源文件+对应源文件依赖的头文件=一个翻译单元)的过程
——防止头文件被循环展开
                ——#ifndef 解决方案(缺点,当文件非常多时,#ifndef __HEAD_H__中容易造成名字__HEAD_H__冲突,#pragma once可以解决这个缺点)
                ——#pragma once 解决方案

编译

——将翻译单元转换为相应的汇编语言表示
——编译优化(release会引入更多的优化,而debug会引入较少的优化)
                ——https://godbolt.org/z/zh9aqx
——增量编译 V.S. 全部编译
——内联函数inline是编译时候的概念,也即内联函数必须在使用的内联函数翻译单元中定义

汇编

链接

合并多个目标文件,关联声明与定义
连接种类:内部连接(比如某个函数只在某个翻译单元内部可见),外部连接,无连接

其他知识

静态变量作用域不是翻译单元而是单个源文件,故静态对象定义在头文件中,源文件依然无法使用。

为什么要使用extern + 变量?
将变量的声明与定义分离,主要针对全局变量;
在哪里声明?在哪里定义呢?

全局变量不能在头文件中定义,如果在头文件中定义,那么如果有两个不同源文件分别都包含该头文件,那么在一个程序中一定会出现全局变量重复定义的错误。
所以全局变量在cpp中定义,在头文件中声明最好。那么全局变量在哪个cpp文件定义最好呢?一般定义在main函数cpp文件吧
static:静态全局变量只在定义它的文件内有效,也在全局数据区,默认自动初始化为0。

extern int a = 0和int a = 0同样都是对a的定义 ,只不过第二种是省略了extern而已。

如果想要使用全局变量,

  • 第1种情况,该翻译单元中没有定义变量的情况下使用全局变量,那么需要提前声明全局变量才能使用,否则编译器会报错;
  • 第2种情况,在该翻译单元中定义全局变量,

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:

服务器高级架构体系:https://ke.qq.com/course/417774?flowToken=1010783
音视频开发体系:https://ke.qq.com/course/3202131?flowToken=1040744
dpdk系统学习:https://ke.qq.com/course/5066203?flowToken=1043154
内核系统学习:https://ke.qq.com/course/4032547?flowToken=1042705
golang云原生体系:https://ke.qq.com/course/422970?flowToken=1043281

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值