C语言之关键字:static

在C语言中,关键字static有两种用法。

1)static的第一种用法是:用来修饰局部变量,形成静态局部变量。非静态局部变量分配在栈上,而静态局部变量分配在

数据段/bss段上。

2)static的第二种用法是:修饰全局变量和函数
    (1)普通的(非静态)的函数/全局变量,默认的链接属性是外部的,也就是其链接属性为整个工程,可在工程中的其他文件使用这些函数、全局变量。

    (2)static(静态)的函数/全局变量,链接属性是内部链接,也就是将函数和全局变量的链接属性限定为文件内,只能在当前文件内被引用。

为了便于理解,可以阅读以下文字:微笑

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qslv_bhlt/article/details/79477917
今日推荐