关于符号(变量)的作用域,其实现还是C编译器的规则所致。 但我们真的需要去搞懂这个东西,不然你用不好C语言,或者说是人云亦云的在使用。从我自己看来,符号无非就是二大特性:链接特性和存储特性(全局、局部特性)。这个谁不知道啊,用C的都知道,其实从变量定义的位置就可以很清楚的知道这些区别,我来大概说下:从C语言的结构上来说,变量定义的位置无非在这二个位置:1、程序体内(也包括程序头的变量定义) 2、程序体外和文件内部之间。一、程序体内定义的默认是局部变量(也就是可以被覆盖,理由是程序运行的代码局部性)。 那么有个问题了,那我要在程序体内定义全局变量呢? 这就需要使用C语言提供关键字static,比如 static char i;这样,这个变量i就是一个全局变量了,但你认为它真的是全局变量了吗?! 是全局变量,但你仍不能在外部使用它,这是为什么呢? 这是由于它的链接特性决定的,或者说你没有改变变量的链接特性。这就需要改变变量的链接特性: extern static char i;这样的定义才是真正意义上的全局变量。不过这样的定义也要看你的C编译器支持不支持了,所以就如同我说的那样,我们学习C语言就是可以说是在学习C编译器的规则。二、程序体外和文件内部之间定义的默认的是全局变量,那你认为他是真正意义上的全局变量吗?! 会不会也像程序体内那样不能在外部使用它?! 不是的,C编译器的特性已规定,在这样的位置上定义的变量默认的就有外部链接特性,所以是真正意义上的全局变量。那有人会说,我要成为局部怎么办?或者说我不想让外部用,或者说万一不小心和其他地方的变量同名冲突了怎么办? 这好办,同样也用关键字static, 如:static char i;这时在这个位置上定义的变量并非改变它的存储特性,而是改变的是链接特性,变成了文件内部有效的变量了;也就是说在当前文件中有多少个程序体,那么对这些多少个程序体来说,还是一个全局变量(因为这些程序体在同一个文件中)。
下面再来总结下: 其实变量的作用域就是链接特性和存储特性。 链接特性:外链接、内链接、空链接。存储特性:全局、局部存储。对于链接特性可以说是绝对的方式,因为在C编译阶段,C编译器只是也只能以绝对的方式来处理,如果一定要说是相对的,那就是相对于链接器来说的。 而对于存储特性,就不是绝对了,因为那是C编译器的基本工作和功能。对程序体内来说的全局和局部变量和符号,对文件内和程序体外的全局和局部变量和符号,还有就是对我们外部有用的全局变量和符号、还是对我们外部不能声明引用的全局变量和符号。如果从实现的完备角度考虑,有些的对我们编程现实是没有意义。 下面再来说下链接特性的具体情况: |