打印
[C语言]

浅说下符号(变量)的作用域。

[复制链接]
1581|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoyuan_ly|  楼主 | 2013-10-8 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    关于符号(变量)的作用域,其实现还是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编译器的基本工作和功能。对程序体内来说的全局和局部变量和符号,对文件内和程序体外的全局和局部变量和符号,还有就是对我们外部有用的全局变量和符号、还是对我们外部不能声明引用的全局变量和符号。如果从实现的完备角度考虑,有些的对我们编程现实是没有意义。 下面再来说下链接特性的具体情况:
评分
参与人数 1威望 +6 收起 理由
dong_abc + 6 学习一下。

相关帖子

沙发
xiaoyuan_ly|  楼主 | 2013-10-8 20:46 | 只看该作者
接着说: 在程序内部定义的默认处理是:局部和空链接 在程序外部的默认处理是: 全局和外部链接,这里说的是编译器在没有关键字下的默认处理方式。你可以想象下,如果你是那个C编译器,你怎么来识别这些变量呢?! 我想分类就是比较好的处理方式,C编译器也是这么处理的,所以我在不同“类”的相同符号和变量是不会冲突的。就想你家的是西安路10号,他家的北京路10号,同样的变量10号,却是属于不同的“类”西安路和北京路。同理,对链接特性和存储特性进行穷举后,也会得到有限的N个“类”,这样就有了不同类下可以同名符号和变量名了。当然穷举后得到的所有“类”可能并非一定具有物理和现实意义,所以没有物理和现实意义的就会被舍弃。这样得到的规则下的“类”并不很多。只是C语言也许是为了节省关键字的数量,static被赋予了在不同位置定义时的修饰意义;在程序内部被赋予从局部变量向程序内部全局变量的转变, 在程序体外部赋予从外部链接向内部链接的转变,前者改变的是存储特性,后者改变的是链接特性。至于用extern 和 static 这2个关键字修饰符,从道理上讲(只要你用的编译器支持),其实可以实现在任意位置的符号和变量定义而达到相同的目的,只是我们总有自己的习惯,越方便的少打代码的,又能很清晰的表达就够了。那么同样函数名这个符号也具有以上的相同的意义,在我看来就是外部链接和内部链接,函数默认是外部链接的。

使用特权

评论回复
板凳
chenbb8| | 2013-10-8 21:35 | 只看该作者
我来接分了,LZ的断行好难看。
以前我只是从表面上的特征,将变量起作用的范围称为可视范围,原来还有学名的
外链接、内链接、空链接,这名字好像武林秘籍一样高深~~

使用特权

评论回复
地板
annwa| | 2013-10-9 15:36 | 只看该作者
楼主,编辑一下好不!看起来真累

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:追求卓越,成功将不期而至。

27

主题

284

帖子

1

粉丝