c++ 变量作用范围理解

本文解析了静态变量在编译过程中的作用,通过实例说明了在头文件中使用static的条件,并结合Makefile示例讨论了extern和static的区别。特别关注了在链接阶段静态变量的限制和Makefile配置中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static 限定于文件内的,怎么理解。我们知道b如果include a,那么其实b就包含a的所有内容这个编译器预编译阶段就做了,所以这个时候b能够访问a中static变量(情况1)。假设b依赖的变量不在include的文件里面,那么这个变量就应该用extern来声明,具体定义在另外一个文件里面。那么此变量在另外一个文件就不应该用static了,否则不能被别的文件通过extern 来寻找定位(情况2)。

makefile文件如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
OBJ=a.o b.o

a.o:a.cpp
   g++ -c -o a.o a.cpp
b.o:b.cpp
   g++ -c -o b.o b.cpp
test:a.o b.o
   g++ -o test $(OBJ)
clean:
   rm edit $(objects)

情况1:

a.h

static int b=6; //用static 不用static都可以

a.cpp

#include  <iostream>
#include "a.h"
#include <windows.h>
int main(int argc,char *argv[]){
   std::cout<<"test"<<b<<std::endl;
    Sleep(5000);
   return 0;
}

上述情况,由于a.cpp 已经包含了a.h,那么a中变量b不管是不是static对于a都是可见的。

情况2:

a.h

//static int b=6; //用static 不用static都可以

a.cpp

#include  <iostream>
#include "a.h"
#include <windows.h>
extern int b;
int main(int argc,char *argv[]){
   std::cout<<"test"<<b<<std::endl;
    Sleep(5000);
   return 0;
}

b.h

int b=7; //此时变量b不能添加static,否则会编译失败。

情况2中变量b定义已经被注释掉了,使用了extern int b;此时编译 a.o是没用问题的,但是再链接的时候一定要找到b的定义。int b在b.h定义的,我们链接的时候会用到,此时int b前面不能添加static,因为static之限定于文件内可见。显然a.cpp 并不包含b.h文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值