【C语言】 extern与static

【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值