内部函数和外部函数(例子为C语言)

​​​​

怎么来的?

函数本质上是全局的,因为定义一个函数的目的就是这个函数与其他函数之间相互调用,如果不声明的话,一个函数既可以被本文件中的其他函数调用,也可以被其他文件中的函数调用。但是可以指定某些函数不能被其他函数调用,根据函数能否被其他源文件调用,将函数分为内部函数外部函数

内部函数

如果一个函数只能被本文件的其他函数所调用,它被为“内部函数”。在定义内部函数时,加上关键字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]; 
	//input
	printf("Please enter character:\n");
	enter_str(str);//调用enter_str()函数
	scanf("%c",&nc);//nc不需要的字符 
		
	//output
	select_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关键字的时候,不像是内部函数那样写在当前文件里面起作用,而是写在调用它的函数地方,表示的意思这个调用函数把它的作用域扩展到了使用它的地方,即你哪里调用我,这个关键字写上,表示我的作用域就作用在哪里。

  • 39
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值