【C++】static

C中的static

说起static,一般想到它的作用是延长变量的生命周期,如果只是这样那么它跟全局变量有什么区别呢?
在C++之前,C语言就有static了,C的static作用很简单,就是不让其他文件的访问自己的全局变量。
C中,我可以用extern来获取其他.c文件定义的全局变量,而static就是让变量对其他文件不可见,有点类似c++的private。

//file1.c
int a = 5;	//
static b = 6;

//main.c
extern int a;
extern int b;	//会导致链接错误	

题外话:强符号与弱符号

.c中 初始化的全局变量是强符号,未初始化的全局变量是弱符号。
强符号只能有一个,弱符号可以有多个,弱符号可以有多个。
链接器在确定符号时,如果只有弱符号,则会选择弱符号。弱符号因为没有初始化,所以会初始化为0
如:

//glb.c
int glb = 5;
//main.c
int glb;	//弱符号
...
printf("%d", glb);	//输出为5

实际实验发现MSVC中 glb.c和main.c可以通过编译。但是gcc会报符号重复定义的错误。但是gcc中允许 int glb=5; int glb;同时出现在一个文件中,也就是说强弱符号在一个.c文字中是可以的
__attribute(weak)可以强制将符号转为弱符号

题外话:extern

前面说static时,用到了extern来让当前.c可以看见其他.c文件的全局变量,可以说extern int a; 就是全局变量的声明。
其实在C中extern就是用来声明外部接口。如果你在.h中添加了函数声明,编译器默认会为函数声明添加extern

C++中的static

在mian函数执行前初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值