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文件。