【C语言】 extern与static
Test.c
#include <stdio.h>
int main()
{
extern int a;
printf("a:%d\n",a);
}
f1.c
int a = 111;
这样是没有问题的
打印111
但这个时候
f2.c也在你的项目中,正好不巧也有个int 型的变量a
int a = 222;
类似于有个 _a already defined in f1.obj报错!
这里要讨论一下编译。编译以c问一个单独的编译单元,互相之间并不管各自的。把变量放在最外面声明,这是啥,这就是全局变量。所谓的全局变量,只能存在一份唯一的,这里怎么区分它的唯一性呢,就是变量名了,类似于数据库中的id。你要说我换个类型也叫这个名字是否ok呢?
int a = 111;
float a = 3.14f;
sorry!又报错了。也是 redefinition!重定义了。
现在又有一种情况,我把它放在函数里吗可以吗?
int a = 111;
void func()
{
int a = 111;
//float a = 3.14f;
}
去掉注释也是可以的,但一样只能有一条,另一条要注释起来。
这里又涉及到另一个概念,局部变量。
#include <stdio.h>
int x = 9;
int main()
{
int x = 19;
printf("x:%d\n",x);
}
一般在函数体中,优先级是 函数体中的变量会被优先调用,如果把它注释起来。如果要用,回去找全局的变量x。如果你要在其他文件中使用,就需要用extern声明一下。
接下来是static,静态的。一方面这个关键字会让函数体中的变量,使用后不会消失。类似于
#include <stdio.h>
void counter();
int main()
{
counter();
counter();
counter();
}
void counter()
{
static int i = 0;
i++;
printf("counter: %d\n", i);
}
这里去掉static关键字
#include <stdio.h>
void counter();
int main()
{
counter();
counter();
counter();
}
void counter()
{
int i = 0;
i++;
printf("counter: %d\n", i);
}
另外static还有另一个用法,就是一个变量被static修饰了,那么他的作用域就在当前的.c文件中。
即使它和另一个文件中的变量重名了,依旧是可以的。
回到开头,这里把f2.c修改一下
extern int a = 222;
这样就可以了。但要注意,这样会打印f1中变量a的值。
概念提取:
全局变量,局部变量。
关键字 extern和static