了解extern关键字的都应该知到它可也调用别的源文件中的变量和函数,这样在代码多的时候就可以节省很多时间。
而static却要和它反着来(就像是你的女朋友一样,哈哈哈)是要被static标记的变量,extern统统都调用不了,就打个比方
源文件1(先定义一个变量)
int a = 10;
源文件2(想调用原文件1中的a)
extern int a;
这样你在原文件2中便可以直接调用 a 的值
但是当遇到static时
源文件1(先定义一个变量)
static int a = 10;
源文件2(想调用原文件1中的a)
extern int a;
这是你如果想调用 a 它就已经被封锁了,原文件二就找不到 a 的值了
当然你如果觉得extern--static的孽缘就这么点的话,呢你可就太单纯了
extern不仅可以调用变量它也可以用人家的函数比如
源文件1(创建一个函数)
int Add(int x,int y);
int z = x+y ;
printf( "%d",z);
源文件2(调用原文件1中的函数)
extern int Add(int x ,int y); (声明外部函数)
int main ()
{
int a =10;
int b = 2;
int sum=Add( a,b );
printf( "sum = %d\n", sum );
return 0;
}
但是当遇见static时,extern又不行了
源文件1(创建一个函数)
static int Add(int x,int y);
int z = x+y ;
return z;
源文件2(调用原文件1中的函数)
extern int Add(int x ,int y); (声明外部函数)
int main ()
{
int a =10;
int b = 2;
int sum=Add( a,b );
printf( "sum = %d\n", sum );
return 0;
}
对,和你猜想的一样,extern又用不了Add这个函数了
千万不要小瞧了static关键字,它作用可大了
1. static修饰局部变量
让static修饰的变量生命周期会变长,打个比方
viod test()
{int a=1; a++; printf("a=%d\n",a); (其实是要竖着写的,为了省地方)
}
int main()
{
int i=0;
while(i<5)
{
test (); i++;
}
return 0;
} 来猜一猜这里 a 打印的值是几?
答案是 2 2 2 2 2
你猜对了吗?
这里的 int a =1是局部变量,出了循环它将清除再从a = 1开始
呢如果在int a=1;前面加一个static呢?
再来猜一猜这里 a 打印的值是几?
答案是 2 3 4 5 6
这次你有猜对了吗? 如果没有就往下看看吧!
static int = 1;
如果你这样写,呢么a现在是相当于静态的局部变量 ,由于加了static的缘故,a递增后的生命周期延长了,每次它递增后,它的增值将不会被清 0,一直递增。
static关键字
具体来说它有三点
1. static修饰局部变量
局部变量的周期则会变长
2.static修饰全局变量
改变了变量的作用域 --- 让静态的全局变量只能在自己所在的源文件使用就和extern杠上了
3.static 修饰函数
也是改变了函数的作用域---不准确
static修饰函数改变了函数的链接属性
可能有的地方不准确,或者太笼统,哈哈哈,请谅解!