C++: 工程的编译过程中的内部链接和外部链接

文件的创建和编译:

C++工程在编译的过程中,每个cpp文件单独编译,编译生成的目标文件彼此链接,其中包含的函数和全局变量默认情况下都存在外部链接和内部链接(也称为静态链接)。因此其他源文件中可以使用本源文件中的变量和函数。取消外部链接的方法,使用内部链接,可以使用Static关键字,或者采用匿名命名空间, namespace{ … }。添加外部链接可以使用extern关键字,此关键字只是对变量的声明,不会为变量开辟内存空间,当然可以在声明变量的时候同时对变量进行定义。

编译后生成的目标文件虽然彼此间存在链接,但是在单个文件中,函数内部对函数及变量的引用需要有内部链接。(所以需要在本文件内部声明外部变量或函数,或者包含相应的头文件)(对于外部变量只是声明不需要定义,如果定义会产生重定义错误,所以需要采用外部声明关键字extern)

因此:头文件的作用是添加外部变量或函数的声明。当程序中没有对头文件进行包含时,此头文件不参与编译过程,但是编译器会对每一个源文件进行编译。头文件只参与程序编译的预处理过程,#include属于预处理宏,在预处理的过程中程序会展开头文件。

const 和 typedef 默认情况下是内部链接可以使用extern修改为外部链接。

头文件中包含变量的定义,并且头文件被多处包含会造成重定义。可以使用Static关键字让变量只有内部链接属性,这样每个包含此头文件的源文件中都有一个该变量的静态副本,此副本在每一个源文件内都可以独立被操作并不会互相干扰。Static的此种用法同样适用于函数。但是没有包含此头文件的地方,及其他源文件在编译生成目标文件后无法使用这些已经定义为内部链接的变量及函数,也就是它们不参与目标文件间的彼此链接过程。

 

其中全局变量和静态变量是在程序进入main之前进行初始化,并且按照出现的先后顺序初始化。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值