7-6 链接属性

7.6.1 C语言程序的组织架构:多个C文件+多个h文件

(1)庞大、完成的一个C语言程序(譬如Linux内核、uboot)由多个C文件和多个h文件组成的。
(2)程序的生成过程就是:编译 + 链接;编译是为了将函数/变量等变成.o二进制的机器码格式,链接是为了将各个独立分开的二进制的函数链接起来形成一个整体的二进制可执行程序。

7.6.2 编译以文件为单位、链接以工程为单位

(1)编译器工作时是将所有源文件依次读进来,单个为单位进行编译的。
(2)链接的时候实际上是把第一步编译生成的单个的.o文件整体的输入,然后处理链接成一个可执行程序。

7.6.3 三种链接属性:外连接、内连接、无连接

(1)外连接的意思就是外部链接属性,也就是说这家伙可以在整个程序范围内(言下之意就是可以跨文件)进行连接,譬如普通的函数和全局变量属于外连接。
(2)内连接的意思就是内部(C文件内部)连接属性,也就是说这家伙可以在当前的C文件内部范围内进行连接(言下之意就是不能在当前C文件外面的其它C文件中进行访问、链接)。static修饰的函数/全局变量属于内连接。
(3)无连接的意思就是这个符号本身不参与链接,它跟链接没关系。所有的局部变量(auto的、static的)都是无连接的。

7.6.4 函数和全局变量的同名冲突

(1)因为函数和全局变量是外部链接属性,就是说每一个函数和全局变量将来在整个程序中所有的C文件都能被访问,因此在一个程序中的所有C文件中不能出现同名的函数/同名的全局变量。
(2)最简单的解决方案就是起名字不要重复,但是很难做到。主要原因是一个很大的工程中函数和全局变量名字太多了,而且一个大工程不是一个人完成的,是很多人协作完成,所以很难保证不会重名。解决方案呢?
(3)现代高级语言中完美解决这个问题的方法是命名空间namespace(其实就是给一个变量带上各个级别的前缀)。但是C语言不是这么解决的。
(4)C语言比较早碰到这个问题,当时还没发明namespace概念,当时C语言就发明了一种不是很完美但是凑活能用的解决方案,就是三种链接属性的方法。
(5)C语言的链接属性解决重名问题思路是这样的:我们将明显不会在其它C文件中引用(只在当前C文件中引用)的函数/全局变量,使用static修饰使其成为内链接属性,这样在将来链接时即使2个C文件中有重名的函数/全局变量,只要其中一个或2个为内连接属性就没事。
(6)这种解决方案在一定程度上解决了问题。但是没有从根本上解决问题,留下了很多麻烦。所以这个就导致了C语言写很大型的项目难度很大。

7.6.5 static的第二种用法:修饰全局变量和函数

(1)普通的(非静态)的函数/全局变量,默认的链接属性是外部的;
(2)static(静态)的函数/全局变量,链接属性是内部链接。

7.6.6 一般用法总结:

思考:为什么static一个关键字可以有2种完全不同的意思?因为这两种用法是互斥的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值