一.概述:
前面讲了,static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问;
extern用来定义和声明一个外部函数,允许其他文件访问。
statuc和extern对变量也有作用,不过跟函数有点差别。
二.再谈谈全局变量:
1.默认情况下,一个函数不可以访问再它后面定义对全局变量。
int main(){
a= 18;
return 0;
}
int a;
这样编译器直接报错了。
第一种解决办法就是,将变量a定义(其实编译器默认加上extern)再main函数前面;
int a;
int main(){
a= 10;
return 0;
}
这样编译器就不会找你麻烦了。
第二种解决办法:在main函数前面对变量a进行提前声明。
也就是让main函数知道变量a的存在就行了,至于变量a定义在哪个位置,main函数不用管;
extern用于声明一个已经存在(定义)的变量
extern int a;//仅仅声明
int main(){
a=18;
return 0;
}
int a;//进行定义
声明和定义两回事。
a=18,操作的是 int a变量;
注意:
要是这样,可以骗过编译器,不会报错。
但是运行的时候,会报错。
因为extern只能声明一个已经定义的变量
第三种:
第四种:
如果将局部变量的extern去掉:
就变成局部变量了,遇到 } 就会销毁.
补充:
message.c文件
如果两个文件同时定义一个全局变量,实质上指向的是同一个变量。
注意的时候,两个文件之中,可以main声明 extern a 也可以, message文件中声明extern a,但是两个不文件不能同时声明
extern a,否则报错.
三.satatic:
其实在前面的例子中我们已经看到static关键字在变量中的使用.
在例子中使用static定了一个局部变量,而且我们强调static局部变量在函数中只被初始化一次,直到程序结束后才销毁
那么如果static作用于全局变量是什么效果呢?
如果static作用于全局变量它的作用就是定义一个只能在当前文件访问的全局变量,相等于私有全局变量。
根据上面例子:
输出两个不同的变量。
总结:
1.extern作用于全局变量时用于声明一个已经定义的变量,但是并不能定义变量;
使用extern你可以在其他文件中使用全局变量(当然此时extern可以省略);
2.static作用于局部变量时,该变量只会定义一次,以后在使用时不会重新定义。
当static作用于全局变量时说明该变量只能在当前文件可以访问,其他文件中不能访问;