内部函数和外部函数


       在面向过程的程序设计思想中,蕴藏着很多面向对象的程序设计思想的萌芽,除了前面我们看到的对数据的保护思想外,对函数调用的保护也是这些可贵的萌芽之一.


       我一直试图用最浅显的语言和最简单的程序实例,说明程序设计的一些原理.不过用简单的程序实例,说明复杂的思想或原理,是一件极难的事情,对于函数调用的说明就是如此.

       我们学习标准c的这些原理时:首要的任务是先理解这些原理的意义,如果可能再在程序中应用这些原理;我们将来是一定要进入c++的,c++是面向对象的,对数据和函数的保护原理有了革命性的变化,在标准c中具体的保护技术在c++中大都过时了,但保护的思想被革命性的继承了下来.说这些的意思就是告诉你,保护的思想意义比具体保护技术重要的多,你的任务是首先理解函数保护的意义!


       第一点:一个单位的领导,他用谁,谁就有用;如果领导认为你没用,不用你,你在这个单位就不会发挥任何作用.就像电线杆子戳在那里,就像聋子的耳朵----配搭.


       第二点:前面我们讲到过变量可以定义成全局变量,可以定义为局部变量,我们可以从定义位置上来快速区别它们,如果一个变量定义在所有函数之外,他就是全局变量,所有的工程函数都可以使用它.

       第三点:对于我们本章的例题-----程序4,一切从main()函数开始,而且从main()结束。顾名思义main()----主函数就是这个程序的领导,这应该毫无疑问的,如果main()中不调用max();那么max();摆在那里就没有任何用处;就像电线杆子戳在那里,就像聋子的耳朵----配搭.同样min();average();也是为了main()调用它们完成相应的任务而诞生的.当然,子函数不仅能被主函数调用,子函数之间也可以相互调用.

       总而言之一句话:子函数就是要被另外的函数调用的.

       反过来说,如果希望工程的所有函数都可以使用某个变量,那么你必须把它定义成全局的。


       我们再看一下子函数,既然一个子函数就是要被另外的函数调用的,那么它天生就应该具有全局性,换句话说,子函数天生就是全局的,对外开放的,或者叫外部的,他必须被其他函数唤醒。我们说子函数天生的作用域是全部工程域。


       第四点:我们有时也限定子函数的作用域,例如,如果你做了大程序,这个程序是一个工程,这个工程有10个C文件组成,每个C文件中有10个子函数,假设,有一个文件的文件名是prg1.c,其中有一个函数的名字是max(),正常情况下,max()可以被这个工程中所有10个C文件中的子函数调用,但是,现在,我们可以对max()子函数作一个限制,让它只能被prg1.c文件中的子函数调用,其他的C文件中的函数不能调用max(),这需要如下的书写max:

==================援引自谭浩强<C程序设计>P199===========================

       如果定义子函数时在函数名和函数类型的前面加static,例如:

                   static float max(){};

       可以使函数的作用域限制于所在文件,这种函数只能被本文件中的其他函数所调用,它称为内部函数。

       于是在不同的文件中有同名的内部函数,互不干扰。这样不同的人可以分别编写不同的函数,而不必担心所用函数是否会与其它文件中函数同名,通常把只能由同一个文件使用的函数和外部变量放在一个文件中,在它们前面都冠以static使之局部化,其他文件不能引用。

================================================================================================

       在你完成一个具有工程规模的程序之前,上面这些内容只能是雾里看花,水中望月,于是,我只能建议你立即行动,去写个多文件的工程程序,编译连接运行,测试一下,别无他法。