内部函数:
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static
外部函数:
(1) 在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。
如函数首部可以写为
extern int fun (int a, int b)
(2) 在需要调用此函数的文件中,用extern声明所用的函数是外部函数。
至于你说的内部变量:应该是局部变量
外部变量 应该是全局变量吧
局部变量存放在编译器的栈中,作用区域只在声明的函数范围或者块的作用域内。
全局变量可以作用在文件范围内,也可以通过extern关键字跨文件使用,详细用法可以看我传的附件。
给你一个具体的示例,来看看他们之间的区别与联系:
#include
#include "enter_string.c"//运行多文件程序时,需要使用include关键字将多个文件包含到本文件中。
#include "delete_string.c"//上同。
#include "print_string.c"//上同。
#define N 50
extern n;//声明外部变量。外部变量n是delete_string.c源文件中的一个全程变量(或称外部变量、全局变量)
char del_char;//定义个char型的全局变量(或称全程变量、外部变量)
int test=52;//定义一个int型的全局变量(或称全程变量、外部变量)
void main()
{
extern enter_string(char string[]);//如果外部函数的函数类型为非int型(函数名称前未加类型关键字的缺省为int型),则在使用extern对外部函数作声明时,一定要在extern的后面把外部函数的函数类型关键字添上。
extern delete_string(char string[],char);//上同,使用extern声明外部函数。否则系统报错。
extern print_string(char string[]);//上同,使用extern声明外部函数。否则系统报错。
char string[N];
printf("请输入一个字符串:");
enter_string(string);//调用通过extern作声明的外部函数
puts(string);//puts()函数的括号内可以是变量,也可以是字符串。puts()函数本身自带换行功能。
printf("请输入要删除的字符:");
del_char=getchar();
delete_string(string,del_char);//调用通过extern作声明的外部函数
print_string(string);//调用通过extern作声明的外部函数
puts("/n多源文件组合运行成功!");//puts()函数的括号内可以是字符串,也可以是变量。
}
/*--------------------enter_string.c--------------------*/
char xyz[]="I love /'C/' very much";//char型外部变量——数组。/'表示输出单引号,/"表示输出双引号
enter_string(char string[50])
{
gets(string);//输入字符串
}
/*--------------------delete_string.c--------------------*/
int n;//非static型外部变量(或称全局变量),允许被其他文件中调用
delete_string(char string[50],char ch)
{
int i,j;
for(i=j=0;string[i]!='/0';i++)
if(string[i]!=ch)//如果string[i]不是要删除的字符
string[j++]=string[i];//不可把处行中的j++与for语句的i++写在一起
string[j]='/0';
n=i-j;//计算被删除了多少个ch字符
}
/*--------------------print_string.c--------------------*/
extern char del_char;//用extern关键字对主函数main()中的char型全局变量del_char作外部声明。无需使用include关键字把主调文件“090629-3.c”包含进来,但此处的char必须加上,否则报错。
extern test;//用extern关键字对主函数main()中的int型全局变量test作外部声明。在main()函数中,因为test变量是int型的,所以此处的int关键字可以省略。
extern char xyz[];//xyz[]是“enter_string.c”文件中的全局变量,本应该在本文件中使用include关键字把“enter_string.c”文件包含进来,但因“enter_string.c”已包含到主调文件“090629-3.c”中,所以可以省去本文件中include "enter_string.c"语句而直接使用extern对xyz[]数组作外部声明。
print_string(char string[])
{
printf("共删除了%d个%c~~~~/"%dC/"。/n新字符串是:",n,del_char,test);//n为del_string.c文件中的int型外部变量,del_char为090629-3.c中的char型外部变量,test为090629-3.c中的int型外部变量
puts(string);
printf("%s/n",xyz);
}