C语言里的static和extern的作用是什么?
发布网友
发布时间:2022-03-29 08:57
我来回答
共2个回答
热心网友
时间:2022-03-29 10:26
假如有三个文件:a.h, a.c, main.c
在文件a.c中定义一个全局变量和函数:
int i = 213;
void print(void) { printf("print in a.c"); }
在文件a.h中声明这个全局变量和函数:
extern int i;// 加extern声明而不定义,指明这个变量在某处已定义,此处只是做一个说明
extern void printf(void); // 函数原型即是声明,所以此处可以不用加extern明确这是声明
在文件main.c中:
#include “a.h”
int main()
{
printf("%d\n", i); // 直接使用i
print(); // 直接调用print()
}
---
如果将文件a.c中相关定义改为
static int i = 213;
static void print(void) { printf("print in a.c"); }
文件a.h与main.c中内容不变
此时编译出错,报告找不到print()函数,找不到i,这是因为static*print()和i只能在a.c中使用。
===
如果用static修饰局部变量,则该局部变量将拥有全局生命周期,即在程序执行期间都存在,且其值为上一次使用后的值。
int print(void)
{
static int i = 0;
printf("%d",i++);
}
不加static,每次调用print(),输出结果都是0
加上static,每次调用printf(), 输出结果都不同,即:0,1,2,3……追问也就是说static只是把局部变量修饰为全局变量,而extern是表明这个变量的定义不在当前文件是这个意思吗?
热心网友
时间:2022-03-29 11:44
static两个作用:
1.在函数内部声明,表示该变量生命周期为全局,不会随函数的结束而消亡
2.在函数外部声明,表示该变量仅限于当前编译单元内可见,其他文件中不可以引用该变量
extern作用:
表示该变量或函数的定义需要在外部文件中寻找。所有的函数默认都是extern的。变量前加extern则编译器只会为该变量分配一个符号,而不会实际分配空间。在链接时,链接器会在其他文件中寻找这个符号的定义。