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变量,然后两个源文件又给出该变 : 量不同的定义,则,两个源文件自己用自己的变量,相互独立。所以不建议这样做。
|