全局变量和全局静态变量

主要区别就是作用域:全局变量定义的变量可以被其他文件所看见(即可以被其他文件extern),全局静态变量的作用范围只限于本文件中。

关于在头文件中定义:在#include之后会在cpp文件中展开,相当于在cpp文件中重新定义了变量,当只有一个cpp文件include时,两者没有区别;但是当多个文件都有include时,相当于多个文件定义了同一个变量,比如int a;那么对于static来说,变量是不可见的,在编译时该变量会生成新的名字,如b.cpp文件中的a变量会变成a_b,c.cpp中的a变量会变成a_c,这样在链接的时候两个变量是不会有冲突的;但是若变量不是static的,那么b.cpp和c.cpp的a变量都会编译成同一个名字,如a,那么链接的时候由于两个.obj文件定义了两个名字一样的变量,那么会抛出重复定义变量的错误;

因此,定义全局变量,最好是在.cpp文件中,比如在b.cpp中定义了int a,然后在c.cpp中使用extern a,这样在链接的时候就不会有冲突。其实这个和函数调用的过程差不多,若找不到函数的定义,就用call func代替,直到链接的时候才把func的地址替换。对于extern a也是如此,找不到变量的定义,先用一个符号代替,直到链接的时候做一次替换即可。

发布了154 篇原创文章 · 获赞 27 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a13602955218/article/details/105340531