我们之前了解到,变量有着作用域,有局部变量和外部变量之分。
那么相对于函数而言,也有着内部函数与外部函数的区别。
在程序中,有的函数可以被本文件中的其他函数调用,
也可以被其他文件中的函数调用
但是有的函数却只能被本文件中的其他函数调用,
不能被其他文件中的函数调用。
我们定义一个函数的目的就是为了让它被另外的函数调用,
那么在不加声明的情况下,
这个函数就是全局的,
也就是说该函数既可以被本文件中的函数调用,
也可以被其他文件中的函数调用。
这里我们就需要考虑一些情况,
比如在命名时,两个文件中对两个不同的函数取了相同的名字,
且两个函数只在本文件中发挥作用。
那么,为了避免冲突,就需要对函数进行限制,让它们只能在本文件中使用。
我们根据函数能否被其他源文件调用,把它们分为外部函数和内部函数。
内部函数
只能被本函数中其他函数调用的函数。
形式:
static 类型名 函数名(形参表)
例子:
static int max(int a,int b)
别名:
静态函数
在不同的文件中同名的内部函数是互不干扰的。
外部函数
可以被其他文件中的函数调用的函数。
形式:
extern 类型名 函数名(形参表)
例子:
extern int max(int a,int b)
extern可以省去,默认为外部函数。
我们需要注意,在其他文件中调用这个函数的时候,声明时需要加上关键字extern。这个是可以省略的。
这就表示该函数是在其他文件中定义的外部函数。
接下来我们来看程序:
给出一段字符串,删除其内的某一个字符。
我们利用外部函数来书写。
思路如下:
1.输入一个字符串
2.对字符串中的元素从第一个开始与要删除的字符对照
3.删除字符
4.删除的同时被删除的位置用空字符代替。
那么我们就定义三个外部函数,分别是输入字符串,删除字符和输出字符串。
文件1:
#include <stdio.h>
int main()
{
extern void enter(char a[]);
extern void delete(char a[],char c);
extern void print(char a[]); //声明三个外部函数
char c,a[100]; //定义变量,数组
enter(a); //调用输入函数
scanf(“%c”,&c); //输入要删除的字符
delete(a,c); //调用删除函数
print(a); //调用输出函数
return 0;
}
文件2:
void enter(char a[100])
{
gets(a); //字符串输入函数
}
文件3:
void delete(char a[],char c)
{
int i,j;
for(i=j=0;a[i]!=‘\0’;i++)
if(a[i]!=c)
a[j++]=a[i]; //这里需要注意j++是先运行后加数
a[j]=‘\0’; //这里说的是检测到相同的位置用空字符代替
}
文件4:
void print(char a[])
{
printf(“%s\n”,a);
}
在此我们就可以理解外部函数的基本形式。