来源于cu回帖
----------------------------------------------------------------------------------------
1、在C/C++中,从大的方面来说可以认为只有两种变量类型:放在数据段的变量和在堆栈中生出来的变量。前者包括全局变量和静态变量,也不管这静态变量是全局还是局部的;除此之外的变量均属于后者。
2、变量都存在于内存中。
放在数据段的变量,在整个程序运行过程中,变量存放的位置不变;而在堆栈中的变量却没有固定的内存位置。它们就是摆地摊,一收摊就没啦。既然放在数据段的变量有固定的存储位置,理论上它们就可以被任意使用(读或写)。对静态变量使用的种种限制,只来自于C/C++语法层面 ,在汇编级就没有这回事!
3、放在数据段的变量为什么要分是否静态的?
通俗地讲,是"变量隔离”的需要。
放在堆栈的变量,已经被天然隔离在一个函数内部了。
静态变量是对放在数据段变量的再隔离。
局部静态变量是被隔离在本函数内部的“全局变量”,“本函数内使用,概不外借”。
全局静态变量则是被隔离在本C/C++源程序单个文件内部的“全局变量”,“仅用于本文件内使用,概不外借”。如果你的软件工程就一个文件,那么全局静态变量和全局变量从使用角度看是没有任何区别的。
既已隔离,那么就可以防止“变量名”冲突。你只要注意在内部不打架 ,外部人家爱叫啥不关你的事。比如,在CU上,估计不能再有人叫”老手“了,其他论坛呢,人家也可以叫”老手“,但跟我绝对没有关系。在CU内,你只要叫“老手”,那么大家就知道是找我了:-);否则,你就必须说的明白点,是"CU上的‘老手’”,用C++叫法就是“CU::老手”。
没错。在C/C++编译器内部,它们对静态变量也是这么称呼的。
比如函数print(char *)内的局部静态变量var,就叫print(char *)::var;
类myclass内部静态数据成员var,就叫myclass::var;
由此推论文件abc.cpp内的全局静态变量var就应该叫abc.cpp::var。
可惜,除了myclass::var外,其他都是非法的,起码目前是这样 !
4、全局变量,说到底就是一个大范围(一个软件工程)的全局静态变量。在这范围之外,一样的不可见!!
5、static函数,也是一个隔离,是函数隔离。也是C/C++语法层级的。