C++中关于全局变量储存类别和作用域的探讨

C++中关于全局变量存储类别和作用域的探讨
根据我目前的知识,如果C++想使用全局变量,则一般使用exter和static。
其中extern用于将某个全局变量的定义声明到其他编译模块从而可以被访问和使用。
而static是说这个全局变量只能被本编译模块使用。
问题:
如果一个全局变量只在本编译模块使用,因为全局变量原本就是静态存储的,他是不是可以不用static修饰。如果不用static修饰全局变量,那和用static修饰的全局变量有何区别?

------解决方案--------------------

# include <iostream>

static int a = 0; // 这里的static表示一个意思,指a只在当前文件有效(同时表明别的C++文件中也可以有个a,且跟这里的a没有任何关系)

void foo()
{
    static int b = 0; // 这里的static表示另一个意思,表示b是静态存储的,即函数还没调用或者已经调用完毕,它还在那里
}

int main()
{

    return 0;
}

------解决方案--------------------
如果一个全局变量只在本编译模块使用,因为全局变量原本就是静态存储的,他是不是可以不用static修饰。如果不用static修饰全局变量,那和用static修饰的全局变量有何区别?
答:两者都存在数据段里面,但是,你的全局数据的作用域是作用整个文件,而你的static作为全局只能是当前文件。
------解决方案--------------------
static作为关键字的话,只是说这个变量是内部链接的,也就是只有本编译单元有效。
至于static storage,所有的全局变量都是静态存储的,都放在BSS段里,由操作系统加载程序的时候直接分配内存并初始化。
------解决方案--------------------
C++中关于全局变量储存类别和作用域的探讨

static 的全局变量只能在本文件使用、是用的static的限制作用域的功能、C语言里面内核函数基本都是这样的、可以避免很多不必要的问题、后来C++ 引进using namespace 之后也跟这个差不多

extern 修饰的全局变量是导入一个外部(其他文件.c\.cpp文件定义的非static 修饰的全局变量,这是一般的做法。最好是在.cpp/.c文件定义之后在.h文件里面用extern 再声明一次 那么以后使用的时候只要包括头文件 不需要再用extern导入)

简单说:static int a; 当前文件可见

 int a;全局的,其他文件使用时,extern int a;