static和extern的区别

如题所述

第1个回答  2019-06-06
有几种情况:
首先,extern和static完全不同,extern不能定义一个变量,extern表示的是“已经存在一个变量,但是不在当前的编译单元内,需要在其他编译单元中寻找。”static会定义一个变量,但是分成多种情况。
---------------------------------------------------------------------
先说extern

变量的关系。
先说只有一个文件(编译单元)的:
int
i=10;
//这个是定义一个全局变量,值为10
extern
int
i=10;
//这个是错误的,变量已经存在,怎么赋初值呢?
extern
int
i;
//这个和第一句
int
i=10;
可以同时存在在一个文件中。
再说跨文件(多个编译单元)的:
文件一:(假设这个文件没有错误!!)
int
a=10;
文件二:
extern
int
a;
//
这个正确
extern
float
a;
//
这个编译不会错,赋值会怎样呢?
extern
int
b;
//这个找不到
int
a=9;
//这个出错,全局变量多次定义
int
a;
//同上
static
int
a=9;
//这个正确,这个产生一个仅在文件二中有效的全局变量a,初值为9,注意在文件二中将看不到那个值为10的全局变量!!!!
static就是刚才说的最后一种,此外就是函数内的使用了,不再多说了。
特别的,这样是错误的:
a.c:
static
int
x=10;
b.c:
extern
int
x;
//因为x只在a.c中,b.c中根本看不到x,所以这个extern还是找不到x,因此会在链接时报错。
其他:extern尽量写到.h文件中,写到.c里就是错误的种子,以后它只能得到苦果!
相似回答