有的函数可以被本文件中的其他函数调用,也可以被其他文件 中的函数调用,而有的函数只能被本文件中的其他函数调用,不能被其他文件中的函数调用。
函数本质 是全局的。因为定义一个函数目的就是要被另外的函数调用。如果不加声明的话,一个文件中的函数既可以被本文件中其他函数调用,也可以被其他文件中的函数调用。但是,也可以指定某些函数不能被其他文件调用。根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。
内部函数
如果一个函数只能被本文件中其他函数所调用,就称它为内部函数。在定义内部函数时,需要在函数名和函数类型的前面加static,即:
static 类型名 函数名(形参表)
例如,函数的首行
static int fun(int a,int b)
表示fun是一个内部函数,不能被其他文件调用。
内部函数又称静态函数,因为它是用static声明的。使用内部函数,可以使函数的作用域只局限于所在文件。这样,在不同的文件中即使有同名的函数,也互不干扰。通常,一个大程序往往分工由不同的人分别编写不同的文件模块,在各人编写自己的文件模块时,不必担心所用函数是否会与其他文件模块中的函数同名。
外部函数
如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。
如函数首部可以为
extern int fun(int a,int b)
这样,函数fun就可以为其他文件调用。C语言规定,如果在定义函数时省略extern,则默认为外部函数。
在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使本文件中调用一个函数,也要用函数原型进行声明)。在对此函数作声明时,要加关键字extern,表示该函数“是在其他文件中定义的外部函数”。
例如:
文件main.c
/*有一个字符串,内有若干个字符,现输入一个字符,要求程序将字符串中该字符删去.用外部函数实现*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
extern void delete_str(char s[],char);
char ch,str[40]="zai xu yao diao yong ci han shu de qi t";
printf("原字符串为 :%s\n",str);
printf("请输入想要删除的字符:");
ch=getchar();
delete_str(str,ch);
printf("删除后的字符串为:%s\n",str);
system("pause");
return 0;
}
文件delete.c
void delete_str(char s[],char ch)
{
int i,j;
for(i=0,j=0;s[i]!=0;i++)
if(s[i]!=ch)
s[j++]=s[i];
s[j]=0;
}
在main函数中用到的delete_str是在其他文件中定义的外部函数。通过这个函数可知:使用extern声明就能够在本文件中调用在其他文件中定义的函数,或者说把该函数的作用域扩展到本文件。extern声明的形式就是在函数原型基础上加关键字extern。
由于函数在本质上是外部的,在程序中经常要调用其他文件中的外部函数,为方便编程,C语言允许在声明函数时省写extern。
由此可以进一步理解函数原型的作用。用函数原型能够把函数的作用域扩展到定义该函数的文件之外(不必使用extern)。只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。