static 关键字
static
修饰的全局变量和函数只能在本模块中使用,不能在其它的模块中使用。因此,当一个函数或变量只能在本模块中使用时,不能用
extern “C”
关键字修饰,用在其它的文件中调用。
当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。其它的文件中可以调用该函数和变量。加了static关键字后,相当于做一个隐藏的作用,只对当前调用的文件有效。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
-
比如
a.c
文件中定义了一个全局的
static int num = 100;
变量 和
static int add()
函数,此时变量和函数只能在
a.c
文件中调用,你要想在
b.c
中调用变量和函数,你是行不通的,编译会出错。 -
那么你想在
b.c
、
d.c
、
m.c
等多个文件中调用全局变量和函数,要怎么办了? -
办法就是:你需要将变量或函数用
extern
关键字进行声明,并且不用
static
关键字修饰。注意是声明,而不是定义。
extern int num;
和
extern int add()
,这样操作过后,在
b.c
、
d.c
、
m.c
等多个文件中,你就能使用这个变量和函数了。
Tpis:看声明与定义的区别可以看我之前写的一篇文章。
extern的用法
static修饰的变量在函数体内定义时,表明它的申请的内存是驻留在全局区,直到程序运行结束。但是它作用域仍为局部作用域,只能在函数体内使用定义的该变量,不能在函数体外使用。因此可以得出一个结论:把局部变量改变为static变量后改变了它的生存期。把全局变量改变为static变量后是改变了它的作用域, 限制了它的使用范围,仅仅只在拥有该变量的文件中使用,不能在其它的文件中调用。
static变量在函数体内使用情况
#include <stdio.h>
#include <string.h>
int sub()
{
static int count = 10; // count变量在内存中位于全局区域,直到程序结束时,该变量才会被释放
// int count = 10; // count变量申请的内存空间位于栈区,当前函数体执行完成后,变量就被释放了
return count--;
}
int main(int argc, char *argv[])
{
for (int i = 0; i < 10; i++) {
printf("%d\n",sub());
}
return 0;