C语言中,其他文件可否调用文件中的static函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中,其他文件可否调用文件中的static函数?相关的知识,希望对你有一定的参考价值。

参考技术A 不能,C语言中的static函数,内部函数和外部函数,函数一旦定义后就可被其它函数调用。
当一个源程序由多个源文件组成时,在一个源文件中定义的函数能否被其它源文件中的函数调用,C语言又把函数分为两类。
如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,

这种函数称为内部函数。
内部函数也称为静态函数,但此处静态static
的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。
外部函数在整个源程序中都有效,其定义的一般形式为extern

类型说明符

函数名形参表。
C语言中static函数,只能被本文件中的函数所使用,别的c文件中不能访问这个函数,而且你可以在别的文件中定义与之同名的函数,不会互相干扰。

C语言进阶篇之函数&内存分布

1.static函数
static int Test1();
static可以限定函数的作用域:只能被本文件中的其他函数调用,而不能被同一程序其他文件中的函数调用。

2.extern函数
extern int Test2();
a) extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模板中寻找其定义;
b) extern “C”的含义:在C++出现以前,很多代码都是C语言写的,而且很多底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言语法进行编译。
 
3.inline函数
inline int Test3();
优点
a) 没有调用开销,效率高;
b) inline函数同宏定义一样,可以解决一些频繁调用的小函数大量消耗栈内存的问题,但同时inline是一个函数,调用函数时,编译器会检查参数类型,消除宏定义的隐患。
缺点:
内联函数太复杂或者调用点太多,展开后导致代码膨胀带来的恶化可能大于效率提升带来的益处。
注意:
内联函数一定要在头文件中定义,否则编译器会忽略内联函数的定义。
 






内存分布

BSS

数据段

代码段

1) BSS段:存放程序中 未初始化的全局变量,不占用执行程序大小,其内容由操作系统初始化( 清零)。
2)数据段:存放程序中已初始化的全局变量。
3)代码段:存放程序执行代码的内存区域,大小在程序运行前已经确定,并且通常属于 只读
4)堆:存放进程运行中被 动态分配 的内存段,大小并不固定,可动态扩张或缩减。malloc分配的为此地址。
5)栈:用户存放程序临时创建的 局部变量 (但不包括static声明的变量)。在函数被调用时,其参数也会被压入发起调用的进程栈。

小练习:
int c;
void fun(int a)
{
static int b;
int array[5]={0};
int *p=(int*)malloc(100);
b=a;
c=b+1;
return;
}

以下说法正确的是:
a.放在栈里的变量有a, p, array
b.放在栈里的变量有a, array, b
c.放在BSS段里的变量有b, c
d.放在堆里的变量是p指向的内存
答案将在留言中揭晓哦~

以上是关于C语言中,其他文件可否调用文件中的static函数?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中static修饰的函数和普通函数的区别

main函数可否进行递归调用

c语言中static说明是啥意思?

static在c语言中是啥意思

c语言工程里其它文件引用全局变量?

C语言static 和extern