由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ 全局变量是怎么回事?
相关主题
请教什么时候变量会被load进stack,什么时候进入heap呢?[bssd]goto的现实根据
static 变量放在哪里?C++python用全局变量能节省程序执行时间吗?
c++ 弱问题:static const char* const 这两个const 分别是什么意思?R似乎根本就没有认真考虑过global variable的改写问题
关于多线程编程的一个问题FP over head很高
问个C语言里面全局变量和本地变量引用问题数组定义的时候,分配空间了么?
关于线程读写全局变量的问题What're the three types of memory allocated for C++ variables?
请问多个线程同时访问同一个内存地址会不会使得程序变慢static variable in template header
老哥使用的一项技术: extern定义全局变量C++ Q07: unnamed namespace
相关话题的讨论汇总
话题: static话题: 全局变量话题: c++话题: 变量话题: 源文件
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
定义全局变量,是不是,main 可以使用,同一个文件内的函数也可以使用?
那么,这样的变量不写static是自动算static,还是auto? 编译器是怎么搞定全局变量
访问的?
c***k
发帖数: 1589
2
如果真是全局变量,整个namespace里都可以访问,不写static就不是static,别的文件
如果在一个编译单位里也可以访问。
编译器搞定它很简单啊,只要这个symbol出现在symbol table里就不会认为是非法了。
楼主找两本基本的编译和链接的书看看吧
z****e
发帖数: 2024
3
有什么书推荐的?
编译和链接,我都是靠编程经验理解的。
尤其是链接,没有系统学过。
编译原理好像也不怎么管用,太理论化了。

【在 c***k 的大作中提到】
: 如果真是全局变量,整个namespace里都可以访问,不写static就不是static,别的文件
: 如果在一个编译单位里也可以访问。
: 编译器搞定它很简单啊,只要这个symbol出现在symbol table里就不会认为是非法了。
: 楼主找两本基本的编译和链接的书看看吧

z****e
发帖数: 2024
4
global != static
对,global变量, main 可以使用,同一个文件内的函数也可以使用.
其他源文件,如果想使用这个global,就 extern 声明一下,然后链接的时候把该
global 所在目标文件连上。
static就只能在当前编译单元,也就是当前源文件使用,其他源文件调用的同名变量都是不相同的实例。所以如果你头文件里声明static变量,然后两个源文件又给出该变量不同的定义,则,两个源文件自己用自己的变量,相互独立。所以不建议这样做。

【在 b***i 的大作中提到】
: 定义全局变量,是不是,main 可以使用,同一个文件内的函数也可以使用?
: 那么,这样的变量不写static是自动算static,还是auto? 编译器是怎么搞定全局变量
: 访问的?

b***i
发帖数: 3043
5
我的一点想法,
C语言中函数内部static, 就是把变量放在静态数据区,auto则放在栈上。
然后,全局变量也放在静态数据区,才能被所有函数访问。
我就想,这个也在静态数据区,static就是静态的意思,为什么全局变量不用static声
明。而是规定static 只能在本文件内部访问?一个static 两个用法,是不是多此一举?

都是不相同的实例。所以如果你头文件里声明static变量,然后两个源文件又给出该变
量不同的定义,则,两个源文件自己用自己的变量,相互独立。所以不建议这样做。

【在 z****e 的大作中提到】
: global != static
: 对,global变量, main 可以使用,同一个文件内的函数也可以使用.
: 其他源文件,如果想使用这个global,就 extern 声明一下,然后链接的时候把该
: global 所在目标文件连上。
: static就只能在当前编译单元,也就是当前源文件使用,其他源文件调用的同名变量都是不相同的实例。所以如果你头文件里声明static变量,然后两个源文件又给出该变量不同的定义,则,两个源文件自己用自己的变量,相互独立。所以不建议这样做。

B*****t
发帖数: 335
6
不要忘了static 数据封装的作用

举?

【在 b***i 的大作中提到】
: 我的一点想法,
: C语言中函数内部static, 就是把变量放在静态数据区,auto则放在栈上。
: 然后,全局变量也放在静态数据区,才能被所有函数访问。
: 我就想,这个也在静态数据区,static就是静态的意思,为什么全局变量不用static声
: 明。而是规定static 只能在本文件内部访问?一个static 两个用法,是不是多此一举?
:
: 都是不相同的实例。所以如果你头文件里声明static变量,然后两个源文件又给出该变
: 量不同的定义,则,两个源文件自己用自己的变量,相互独立。所以不建议这样做。

z****e
发帖数: 2024
7
OK! OK!
let's type................
static 的一个重要应用是internal linkage.
而C++ 引入 namespace, 其实有一个原因就是可以来替代static fun,或者static
variable。这种internal linkage就被namespace的作用域给实现了。
你的疑惑可能是以上的东东。
但是static 还远远不止这个作用。
考虑 static member fun, static member data
static member fun 是不需要实例化对象就可以调用的,其实是用类名,作为了
namespace。(注意,static member fun不可作为virtual, 因为无有this,故而也无法访问non-static member)
static member data 对于任意一个类,只有一个实现,这就保证了,既封装了数据,又保留了数据copy的全局唯一性。这一点,是global 无法实现的。
同理,static data in a function, 一样只有一个全局实现,但是其作用域只在

【在 b***i 的大作中提到】
: 我的一点想法,
: C语言中函数内部static, 就是把变量放在静态数据区,auto则放在栈上。
: 然后,全局变量也放在静态数据区,才能被所有函数访问。
: 我就想,这个也在静态数据区,static就是静态的意思,为什么全局变量不用static声
: 明。而是规定static 只能在本文件内部访问?一个static 两个用法,是不是多此一举?
:
: 都是不相同的实例。所以如果你头文件里声明static变量,然后两个源文件又给出该变
: 量不同的定义,则,两个源文件自己用自己的变量,相互独立。所以不建议这样做。

1 (共1页)
进入Programming版参与讨论
相关主题
C++ Q07: unnamed namespace问个C语言里面全局变量和本地变量引用问题
C++: Static initialization dependency关于线程读写全局变量的问题
C++默认的copy constructor的疑惑请问多个线程同时访问同一个内存地址会不会使得程序变慢
C++怎样设置全局变量老哥使用的一项技术: extern定义全局变量
请教什么时候变量会被load进stack,什么时候进入heap呢?[bssd]goto的现实根据
static 变量放在哪里?C++python用全局变量能节省程序执行时间吗?
c++ 弱问题:static const char* const 这两个const 分别是什么意思?R似乎根本就没有认真考虑过global variable的改写问题
关于多线程编程的一个问题FP over head很高
相关话题的讨论汇总
话题: static话题: 全局变量话题: c++话题: 变量话题: 源文件