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

被折叠的 条评论
为什么被折叠?



