欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【时时三省】(C语言基础)内部函数和外部函数

【时时三省】(C语言基础)内部函数和外部函数

2025/6/19 10:45:41 来源:https://blog.csdn.net/2301_81226734/article/details/148749628  浏览:    关键词:【时时三省】(C语言基础)内部函数和外部函数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

变量有作用域,有局部变量和外部变量之分,那么函数有没有类似的问题呢?

答案是有的。有的函数可以被本文件中的其他函数调用,也可以被其他文件中的函数调用,而有的函数只能被本文件中的其他函数调用,不能被其他文件中的函数调用。

函数本质上是全局的,因为定义一个函数的目的就是要被另外的函数调用。如果不加声明的话,一个文件中的函数既可以被本文件中其他函数调用,也可以被其他文件中的函数调用。但是,也可以指定某些函数不能被其他文件调用。

根据函数能否被其他源文件调用将函数区分为内部函数和外部函数。

内部函数

如果一个函数只能被本文件中其他函数所调用,它称为内部函数。

在定义内部函数时,在函数名和函数类型的前面加static,即:

static类型名函数名(形参表);

例如,函数的首行:

static int fun ( int a , int b )

表示fun是一个内部函数,不能被其他文件调用。

内部函数又称静态函数,因为它是用static声明的。使用内部函数,可以使函数的作用域只局限于所在文件。这样,在不同的文件中即使有同名的内部函数,也互不干扰,不必担心所用函数是否会与其他文件模块中的函数同名。

通常把只能由本文件使用的函数和外部变量放在文件的开头,前面都冠以static使之局部化,其他文件不能引用。这就提高了程序的可靠性。

外部函数

如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。

如函数首部可以为

extern int fun ( int a , int b )

这样,函数fun就可以为其他文件调用。C语言规定,如果在定义函数时省略extern,则默认为外部函数。

在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型进行声明)。

在对此函数作声明时,要加关键字extern,表示该函数“是在其他文件中定义的外部函数”。

通过下面的例子,可以具体地了解怎样使用外部函数。

例题:

有一个字符串,内有若干个字符,现输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。

解题思路:

算法是这样的:用一个字符数组str存放一个字符串,然后对str数组中的字符逐个检查,如果不是指定要删除的字符就仍将它存放在数组中。设删除空格。

从str [ 0 ]开始逐个检查数组元素值是否等于指定要删除的字符,若不是就依次留在数组中;若是就不保留。应将str [ 0 ]赋给str [ 0 ],str [ 1 ]→str [ 1 ],str [ 2 ]→str [ 2 ],str [ 3 ]→str [ 3 ],str [ 4 ]是要删除的字符,不应存放在str数组中,然后str [ 5 ]→str [ 4 ]……

可分别定义3个函数用来输入字符串、删除字符、输出字符串。按题目要求把以上3个函数分别放在3个文件中。main函数在另一文件中,main函数调用以上3个函数,实现题目的要求。

编写程序:

文件1

文件2 

文件3

 

文件4

 

运行结果

This is a C progran

ThisisaCprogran

 

输入字符串”This is a C program”给字符数组str,再输入要删去的字符(空格字符)。程序输出已删去空格的字符串“ThisisaCprogram”。

程序分析

整个程序由4个文件组成。每个文件包含一个函数。主函数是主控函数,在主函数中除了声明部分外,只由4个函数调用语句组成。其中scanf是库函数,另外3个是用户自己定义的函数。函数dedele _ string的作用是根据给定的字符串和要删除的字符ch,对字符串作删除处理。

程序中3个函数都是外部函数。在main函数中用extern声明在main函数中用到的enter_string,delete _ string和print_string是在其他文件中定义的外部函数。

读者注意分析如何控制循环变量i和j的变化,以便使被删除的字符,不保留在原数组中。

这个题目当然可以设两个数组,把不删除的字符一一赋给新数组。但我们只用一个数组,只把不被删除的字符保留下来。由于i总是大于或等于j,因此最后保留下来的字符不会覆盖未被检测处理的字符。注意:最后要将结束符\0也复制到被保留的字符后面。

通过这个简单的例子可知:使用extern声明就能够在本文件中调用在其他文件中定义的函数,或者说把该函数的作用域扩展到本文件。extern声明的形式就是在函数原型基础上加关键字extern(见本例main函数中的3个函数声明形式)。

由于函数在本质上是外部的,在程序中经常要调用其他文件中的外部函数,为方便编程,C语言允许在声明函数时省写extern。

例如上例题程序中main函数中的第一个函数声明可写成

void enter_string ( char str []);

这就是多次用过的函数原型。

说明:由此可以进一步理解函数原型的作用。用函数原型能够把函数的作用域扩展到定义该函数的文件之外(不必使用extern)。只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。

利用函数原型扩展函数作用域最常见的例子是# include指令的应用。在# include指令所指定的“头文件”中包含调用库函数时所需的信息。例如,在程序中需要调用sin函数,但三角函数并不是由用户在本文件中定义的,而是存放在数学函数库中的。按以上的介绍,必须在本文件中写出sin函数的原型,否则无法调用sin函数。sin函数的原型是

double sin ( double x );

显然,要求程序设计者在调用库函数时先从手册中查出所用的库函数的原型,并在程序一一写出来是十分麻烦而困难的。为减少程序设计者的困难,在头文件math.h中包括了所有数学函数的原型和其他有关信息,用户只须用以下# include指令:

# include < math.h >

在该文件中就能合法地调用系统提供的各种数学库函数了。

 

 

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词