大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站建设、做网站、广昌网络推广、小程序定制开发、广昌网络营销、广昌企业策划、广昌品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供广昌建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。
定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
static 函数类型 函数名(函数参数表){……}
在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
[extern] 函数类型 函数名(函数参数表){……}
外部函数原型声明要有extern
简单说,外部函数是用户自定义函数,该函数写在另一个文件里.
来自百度百科
C语言外部函数是一种可在自身所处的源文件及其他源文件中都能被调用的函数。外部函数的作用域是整个源程序。
函数调用
编辑
1、在定义函数时,若在函数首部的最左端加关键字extern,则表示此函数是外部调用,可被其他文件调用,函数首部可以为
Extern int fun(int a,int b);
C语言规定,定义函数时省略了extern则隐含为外部函数,可被其他文件调用
2、在需要调用函数的文件中,用extern对函数声明,表示该函数是在其他文件中定义的外部函数
所以外函数只是一种引用方式,大项目多人分开写,可能会有多个文件,最后要整合在一起用。那被引用的文件中函数相对与引用者,就是外部函数。
因为
C语言编译时要检查语法,所以A不对;
C语言没有过程,只有函数,所以B不对;
C语言函数内不能定义函数,既不能嵌套定义,所以C不对。
排除法也知道是D了。当然由“函数内不能定义函数”也可以推出所有函数都是外部函数。
—— 其实这种说法对外部函数的理解也还值得商榷。但其它的是完全不对,也就选它吧。
定义在当前翻译单元(一般是.c文件包含了头文件之后的结果)外,以extern前缀声明的函数对于当前翻译单元来说是外部函数。它提示编译器,假定这个函数的定义存在,但不在当前翻译单元中。因此若语法正确,编译器不对此函数产生标识符未定义的错误。链接器会检查编译器得到的若干目标文件以及静态库文件中的包括函数在内的符号,如果不满足唯一定义性则产生错误,链接失败,不会产生最终目标文件(如.exe可执行文件)。
对于加static前缀声明的函数,编译器认为定义在当前翻译单元或库中且不会被其它翻译单元引用(也就是说函数仅对当前源文件有效)。相对于extern(外部)函数,这些函数可以称为internal(内部)函数。
而不加extern或static声明的函数,默认为定义在当前翻译单元中,且其它翻译单元可以用extern函数声明引用这个函数(对链接器可见)。
对于非extern函数,如果编译器在当前翻译单元中找不到函数的定义,则产生标识符未定义的编译错误,编译失败。
====
[原创回答团]
有两种理解.(1)库函数是C语言的内部函数或自带函数,外部函数即程序员自定函数.
(2)凡加写了extern 的函数是外部函数.
第一种理解好懂:
C语言的内部函数指的是C语言自带的函数,无论是动态链接的或静态链接的. 这些函数通过C语言的头文件定义了.
例如, sin(),cos()等数学函数,在math.h中定义了,输入输出函数 printf(),fgetc()在stdio.h中定义了,时间函数表time(),ctime()等在time.h中定义了.还有许多其他内部函数.编程时,只要用#include 库名.h写在编程头部,程序中就可调用.
自定义函数,就是用户自己写的函数.
第二种凡加写了extern 的函数是外部函数:
自定义函数可以与程序的main()写在同一个文件中,也可以写在另一个文件中,这时你可能还另写自己的头文件或者写extern....,告诉编译器,main中用到的某某函数是"外部函数".
例如,main()在a.c中,自定义函数my_func()在a2.c中
a.c内容:
#include stdio.h
extern float my_func(float a);
main()
{
printf("result=%f\n",my_func(2.0));
}
a2.c 内容:
float my_func(float a)
{
return a;
}
编译:
cl -c a.c [得到a.obj]
cl -c a2.c [得到a2.obj]
cl a.obj a2.obj [链接成a.exe]
运行:
a.exe
得
result=2.000000
extern float my_func() 是外部说明,告诉编译,main()里的my_func是外部函数,要通过链接(.obj)得到.
如果把my_func写在a.c里:
#include stdio.h
float my_func(float a){
retun a;
}
main()
{
printf("result=%f\n",my_func(2.0));
}
my_func() 就不是外部函数.
编译:
cl a.c [得a.exe]
运行:
a.exe
得
result=2.000000
内部函数跟外部函数的区别在于:一个文件中定义的函数能否被其它文件调用。能被调用的函数在前面加extern(一般省略),而不能被调用的加static(不能省略),通常函数本质上是全局的,也就是外部的可调用的。
我们通常调用的#include本质上就是一些外部函数的集合,由于在一个文件中的函数要调用另外一个文件的函数,要求在开始声明一下,为了省略这些声明,我们引用include命令。