怎么来的?
函数本质上是全局的,因为定义一个函数的目的就是这个函数与其他函数之间相互调用,如果不声明的话,一个函数既可以被本文件中的其他函数调用,也可以被其他文件中的函数调用。但是可以指定某些函数不能被其他函数调用,根据函数能否被其他源文件调用,将函数分为内部函数和外部函数。
内部函数
如果一个函数只能被本文件的其他函数所调用,它被为“内部函数”。在定义内部函数时,加上关键字static,这个关键字可以理解为“我就只停留在这儿了,其他地方我不去”。
static int(int a,int b){}
int(int a,int b){}
外部函数
如果定义外部函数时,在函数首部可以加上关键字extern,这就是外部函数了定义如下:
//这个两个的作用是相同的
extern int(int a,int b){}
int(int a,int b){}
extern这个关键字可以理解为“我可以去其他地方,不限于此处”。其实完全没必要定义,因为C语言规定:如果在定义函数时省略extern,则默认为外部函数。
明确一下内外的概念:
比如上面这个在JuneProject这个文件夹下面有三个C的源文件,分别为main01.c 、main02.c 、main03.c。
对于源文件 main01.c来说,main02.c 、main03.c就是外面;
同理,对于main02.c和main03.c也是这样关系。
首先进入main01.c
//main01.c
#include <stdio.h>
static void swap(int *a,int *b);
void mul();int main(int argc, char** argv) {int x,y;x = 2,y =3;swap(&x,&y);printf("x=%d,y=%d",x,y);return 0;
}static void swap(int *a,int *b)
{int temp;temp = *a;*a = *b;*b = temp;
}void mul()
{
}
.........
main01.c里面有两个函数,一个是main()函数,另一个是swap()函数,还可以添加其他函数。
加上static后,swap()就只能被miain01.c这个文件里面的其他函数调用,swap()就只在miain01.c里面发挥作用,就是main01.的内部函数,而对于main02.c和main03.c来说,它就是外部函数(严谨一些,前提是mian02.c和main03.c里面没有定义swap()函数)。
内部函数:swap()就只停留在main01.c被调用了,其他地方(main02.c,main03.c)我不去。
而不加关键字static,它就会更加自由,就是外部函数了,所以说swap()可以去其他地方(main02.c,main03.c),不限于此处(main01.c),虽然不加extern也是外部函数,但为了更加醒目一些加上extern更规范。接下来就看看怎么这个extern关键字的运用吧!
外部函数的实例
本例用的是dev C++下建立的项目演示的。
只有3main.c这个里面有main()函数。这三个函数的内容分别如下:
//1enter_str.c
void enter_str(char str[80])
{gets(str);
}
//2select_str.c
//功能:剔除掉不需要的字符的字符串
void select_str(char str[80],char nch)
{int i,j;for(i=j=0;str[i]!='\0';i++)//输入的字符大小,以键盘enter作结(相当于添加'\0') {if(str[i]!= nch)//nch代表空字符,是不需要的字符。 str[j++] = str[i];//把不需要的字符剔除后保存在str数组中 }str[j] = '\0';//在这个新的数组后面添上'\0'
}
//3main.c
#include <stdio.h>
//声明函数
extern void enter_str(char str[80]);
extern void select_str(char str[80],char nch);int main(int argc, char** argv) {char nc,str[80]; //inputprintf("Please enter character:\n");enter_str(str);//调用enter_str()函数scanf("%c",&nc);//nc不需要的字符 //outputselect_str(str,nc);//调用elect_str()函数printf("%s\n",str);return 0;
}//总结:gets(&arry),scanf("%c",&arry)必须输入的地址,而在传参数的时候和定义的变量的一样。
在3main()主函数所在的这个文件,编译,运行后便是下面的结果。
注解:
extern解读
void enter_str()函数在1enter_str.c文件里面定义的。
void select_str()函数是在2select_str.c文件里面定义的。
extern却是写在调用这些函数的3mian.c文件里面。
写这个extern关键字的时候,不像是内部函数那样写在当前文件里面起作用,而是写在调用它的函数地方,表示的意思这个调用函数把它的作用域扩展到了使用它的地方,即你哪里调用我,这个关键字写上,表示我的作用域就作用在哪里。