C语言-内部函数和外部函数.doc_第1页
C语言-内部函数和外部函数.doc_第2页
C语言-内部函数和外部函数.doc_第3页
C语言-内部函数和外部函数.doc_第4页
C语言-内部函数和外部函数.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LAP 8.10 内部函数和外部函数函数本质上是全局的,因为一个函数要被另外的函数调用,但是,也可以指定函数不能被其他文件调用根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。 8.10.1 内部函数如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。即static 类型标识符函数名(形参表)如: static int fun(int a,int b)内部函数又称静态函数。使用内部函数,可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。这样不同的人可以分别编写不同的函数,而不必担心所用函数是否会与其他文件中函数同名,通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们前面都static使之局部化,其他文件不能引用。8.10.2外部函数(1) 在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。如函数首部可以写为extern int fun (int a, int b)这样,函数fun就可以为其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。本书前面所用的函数都是外部函数。(2) 在需要调用此函数的文件中,用extern声明所用的函数是外部函数。例8.22有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。file1c(文件1)main() extern enter-string(char str80); extern delete-strin g(char str ,char ch); extern print-string(char str); /以上3行声明在本函数中将要调用的在其他文件中定义的3个函数 char c; char str80; enter-string(str); scanf(c,c); delete-string(str,c); print-string(str); file2c(文件2) include enter-string(char str80)定义外部函数enter-string* gets(str); 读入字符串str*file3c(文件3)delete-string(char str,char ch) /定义外部函数delete-string int i,; for(i0;stri!0;i) if(stri!ch) strstri; strj0;file4c(文件4)print-string(char str)定义外部函数print-string printf(s,str); 运行情况如下:abcdefgc(输入str) c (输入要删去的字符)abdefg (输出已删去指定字符的字符串)整个程序由4个文件组成。每个文件包含一个函数。主函数是主控函数,除声明部分外,由4个函数调用语句组成。其中scanf是库函数,另外3个是用户自己定义的函数。函数delete-string的作用是根据 给定的字符串str和要删除的字符ch,对str作删除处理。算法是这样的:对str数组的字符逐个检查,如果不是被删除的字符就将它存放在数组中,见图8.21(设删除空格)。从str0开始逐个检查数组元素值是否等于指定要删除的字符,若不是就留在数组中,若是就不保留。从图中可以看到,应该使str0赋给str0,str1str1,str2str2,str3str3,然后str5str4请读者注意分析如何控制i和的变化,以便使被删除的字符不保留在原数组中。这个题目当然可以设两个数组,把不删除的字符一一赋给新数组。但我们只用一个数组,只把不被删除的字符保留下来。由于i总是大于或等于,因此最后保留下来的字符不会覆盖未被检测处理的字符。最后将结束符0也复制到被保留的字符后面。程序中3个函数都定义为外部函数。在main函数中用extern声明在main函数中用到的enter-string、delete-string、print-string是在其他文件中定义的外部函数。通过此例可知:使用extern声明就能够在一个文件中调用其他文件中定义的函数,或者说把该函数的作用域扩展到本文件。extern声明的形式就是在函数原型基础上加关键字extern(见本例main函数中的声明形式)。由于函数在本质上是外部的,在程序中经常要调用外部函数,为方便编程,C语言允许在声明函数时省写extern。例8.21程序main函数中对power函数的声明就没有用extern,但作用相同。一般都省写extern,例如例8.22程序main函数中的第一个函数声明可写成enter-string(char str80);这就是我们多次用过的函数原型。由此可以进一步理解函数原型的作用。用函数原型也能够把函数的作用域扩展到定义该函数的文件之外(不必使用extern)。只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。利用函数原型扩展函数作用域最常见的例子是#include命令的应用。在前面几章中曾多次使用过#include命令,并提到过:在#include命令所指定的“头文件”中包含有调用库函数时所需的信息。例如,在程序中需要调用sin函数,但三角函数并不是由用户在本文件中定义的,而是存放在数学函数库中的。 按以上的介绍,必须在本文件中写出sin函数的原型,否则无法调用sin函数。sin函数的原型是double sin(double x);显然,要求程序设计者在调用库函数时先从手册中查出所用的库函数的原型,并在程序中一一写出来是麻烦而困难的。为减少程序设计者的困难,在头文件math.h中包括了所有数学函数的原型和其他有关信息,用户只需用以下#include命令: #include 这样,在该文件中就能合法地调用各数学库函数了。举例加深理解:C语言的内部函数指的是C语言自带的函数,无论是动态链接的或静态链接的. 这些函数通过C语言的头文件定义了.例如, sin(),cos()等数学函数,在math.h中定义了,输入输出函数 printf(),fgetc()在stdio.h中定义了,时间函数表time(),ctime()等在time.h中定义了.还有许多其他内部函数.编程时,只要用#include 写在编程头部,程序中就可调用.自定义函数,就是用户自己写的函数.第二种凡加写了extern 的函数是外部函数:自定义函数可以与程序的main()写在同一个文件中,也可以写在另一个文件中,这时你可能还另写自己的头文件或者写extern.,告诉编译器,main中用到的某某函数是外部函数.例如,main()在a.c中,自定义函数my_func()在a2.c中a.c内容:#include extern float my_func(float a);main()printf(result=%fn,my_func(2.0);a2.c 内容:float my_func(float a)return a;编译:cl -c a.c 得到a.objcl -c a2.c 得到a2.objcl a.obj a2.obj 链接成a.exe运行:a.exe得result=2.000000extern float my_func() 是外部说明,告诉编译,main()里的my_func是外部函数,要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论