定义C函数时,在缺省情况下函数的名字是全局可见的。可以在函数的名字前加个冗余的extern关键字,也可以不加,效果是一样的。

这个函数对于链接到它所在的目标文件的任何东西都是可见的,如果想限制对这个函数的访问,就必须加个static关键字。

1
2
3
return_type fun() { /*在任何地方均可见*/ }  
extern return_type fun() { /*在任何地方均可见*/ }
static return_type fun() { /*在这个文件之外不可见*/ }

在C中,事实上,很多人都没有在函数名前添加存储类型说明符的习惯,所以大多数函数都是全局可见的。
这种太大范围的全局可见性会与C语言的另一个特性互相影响,那就是interposition。interposition就是用户编写和库函数同名的函数并取而代之的行为。许多C程序员完全没有注意过这个特性。
范围过宽的问题常见于库中:一个库需要让一个对象在另一个库中可见,唯一的方法是让它变得全局可见。但这样一来,它对于链接到该库的所有对象都是可见的了。这就是”all-or-nothing”——一个符号要么全局可见,要么对其他文件都不可见。在C语言中,对信息可见性的选择就是这么有限。
一个大型函数内部的一群调用的内部函数,如果外文件调用不到这些内部函数,在这些函数声明时最好加上static限定符,否则缺省情况下这些内部函数是全局可见的。
软件对象在大多数情况下应该缺省的采用有限可见性,当程序员需要让它全局可见时,应该采用显示的手段。