预计阅读本页时间:-
函数也具有存储类。函数可以是外部的(默认情况下)或者静态的(C99增加了第三种可能性,即在第16章“C预处理器和C库”中将讨论的内联函数)。外部函数可被其他文件中的函数调用,而静态函数只可以在定义它的文件中使用。例如,考虑一个包含如下函数声明的文件:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
函数gamma()和delta()可被程序的其他文件中的函数使用,而beta()则不可以。因为beta()被限定在一个文件内,故可在其他文件中使用具有相同名称的不同函数。使用static存储类的原因之一就是创建为一个特定模块所私有的函数,从而避免可能的名字冲突。
通常使用关键字extern来声明在其他文件中定义的函数。这一习惯做法主要是为了使程序更清晰,因为除非函数声明使用了关键字static,否则认为它是extern的。
使用哪种存储类
对“使用哪种存储类?”这个问题的回答多半是“自动的”。否则为什么要选择自动类型作为默认类型?是的,我们知道乍看起来外部存储很有诱惑力。把变量都设成外部变量,就不用为使用参数和指针在函数之间传递数据而费心了。然而,这存在着一种不十分明显的缺陷。您将不得不为函数A()违背您的意图,偷偷修改了函数B()所用的变量而焦急。多年来,无数程序员的经验给出了无可置疑的证据,证明随意使用外部变量带来的这一不十分明显的危险远比它所带来的表面吸引力重要。
保护性程序设计中一个非常重要的规则就是“需要知道”原则。尽可能保持每个函数的内部工作对该函数的私有性,只共享那些需要共享的变量。除了自动类型以外,其他类型也是有用的,并且可用。但请在使用一个类型前,问问自己是否必须那样做。