C语言学习笔记(二九)
admin
2024-04-23 00:17:02
0

C语言学习第二十九天。

4.4 作用域规则
构成C语言程序的函数与外部变量可以分开进行编译。一个程序可以存放在几个文件中,原先已编译过的函数可以从库中进行加载。这里我们感兴趣的问题有:
    如何进行声明才能确保变量在编译时被正确声明?
    如何安排声明的位置才能确保程序在加载时各部分能正确连接?
    如何组织程序中的声明才能确保只有一份副本?
    如何初始化外部变量?
为了讨论这些问题,我们重新组织前面的计算器程序,将它分散到多个文件中。从实践的角度来看,计算器程序比较小,不值得分成几个文件存放,但通过它可以很好地说明较大的程序中遇到的类似问题。
名字作用域指的时程序中可以使用该名字的部分。对于在函数开头声明的自动变量来说,其作用域时声明该变量名的函数。不同函数声明的具有相同名字的各个局部变量之间没有任何关系。函数的参数也是这样的,实际上可以将它看作是局部变量。
外部变量或函数的作用域从声明它的地方开始,到其所在的(待编译的)文件的末尾结束。例如,如果main、sp、val、push和pop是依次定义在某个文件中的5各函数或外部变量,如下所示:

    main() {...}

    int sp = 0;
    double val[MAXVAL];

    void push(double f) {...}

    double pop(void) {...}

那么,在push与pop这两个函数中不需要进行任何声明就可以通过名字访问变量sp与val,但是,这两个变量名不能用在main函数中,push与pop函数也不能用在main函数中。
另一方面,如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不再同一个源文件中,则必须在相应的变量声明中强制性地使用关键字extern。
将外部变量的声明与定义严格区分开来很重要。变量声明用于说明变量的属性(主要是变量的类型),而变量定义除此以外还将引起存储器的分配。如果将下列语句放在所有函数的外部:

    int sp;
    double val[MAXVAL];

那么这两条语句将定义外部变量sp与val,并为之分配存储单元,同时着两条语句还可以作为该源文件中其余部分的声明。而下面的两行语句:

    extern int sp;
    extern double val[];

为源文件的其余部分声明了一个int类型的外部变量sp以及一个double数组类型的外部变量val,但这两个声明并没有建立变量或为他们分配存储单元。
在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义依次,而其他文件可以通过extern声明来访问它。外部变量的定义中必须指定数组的长度,但extern声明则不一定要指定数组的长度。
外部变量的初始化只能出现在其定义中。
假定函数push与pop定义在一个文件中,而变量val与sp在另一个文件中定义并被初始化,则需要通过下面这些定义与声明把这些函数和变量“绑定”在一起。

    在文件file1中:
    extern int sp;
    extern double val[];

    void push(double f) {...}
    double pop(void) {...}

    在文件file2中:
    int sp = 0;
    double val[MAXVAL];

由于文件file1中的extern声明不仅放在函数定义的外面,而且还放在它们的前面,因此它们适用与该文件中的所有函数。对于file1,这样一组声明就各够了,如果要在同一文件中先使用、后定义变量sp与val,也需要按照这种方式来组织文件。

相关内容

热门资讯

瞄准未获Mythos使用权限的... 法国AI初创公司Mistral AI正与欧洲多家 银行洽谈,计划部署其对标Anthropic PBC...
一件代发怎么找云仓?按这四步走... 想做无货源电商,或者想把自己从打包发货中解放出来,“一件代发”是电商卖家无法绕不开的。问题来了,市面...
优化房地产政策促市场热度提升 4月28日召开的中共中央政治局会议指出,要努力稳定房地产市场。近期,多城市调整优化房地产调控政策,从...
“视听北京·金融作品征集”活动... 2026年5月13日,第六届中国(北京)广电媒体融合发展大会“金融新视界・视听新动能”金融与视听产业...
黄金走势图蓄势反弹 低成本布局... 来源:环球市场播报 如果你一直在关注SPDR 黄金份额 ETF(GLD),会发现金价近期处于盘整震荡...
马斯克点赞宇树载人机甲:很酷 站长之家(ChinaZ.com)5月13日 消息:宇树科技在5月12日扔出了一颗重磅炸弹。这家公司正...
「数据看盘」IM期指空头大幅加... 龙虎榜方面,红板科技获多家量化资金和游资的关注,获一家量化(摩根大通中国银城中路)买入0.62亿,遭...
原创 今... 2026年5月13日金价:大家不必继续盲目等待了!接下来,金价有可能会重演历史! 国内黄金价格继续处...
“中国最大AI包工头”冲击IP... 记者|鄢银婵 编辑|何小桃 廖丹 杜恒峰 校对|金冥羽 2026年4月29日,上海基流科技股份有限公...
白敬亭沈腾成立开门见衫公司 大象新闻记者 林林 天眼查App显示,5月12日,上海开门见衫品牌管理有限公司成立,法定代表人为上官...
原创 从... 今天来给大家聊一下中国磷化铟。2026年第一季度,全球前六大光模块厂商,中国占据四席;800G和1....
财报会释放重要信号,吴泳铭解读... 新京报贝壳财经讯(记者程子姣)5月13日,阿里巴巴集团发布2026财年第四季度与全年财报。在当晚的财...
抖音让大流量转化为大消费 “3、2、1,上链接!”不再是一句直播间的卖货口号,而是吃喝玩乐一站式服务的标语。文旅风光、特色餐饮...
千亿资本开支换来自由现金流转负... AI行业的竞争已从“模型竞赛”转入“算力消耗战”,为了应对这一趋势,阿里也正在大举进行新一轮AI基础...
原创 美... 美国诺克斯堡金库,那座号称囤积了4500吨黄金的神秘仓库,再次成为舆论焦点。而美国总统特朗普,这位以...
东方嘉富人寿:童超当选公司董事... 北京商报讯(记者 李秀梅)5月13日,东方嘉富人寿保险有限公司(以下简称“东方嘉富人寿”)公告,根据...
布朗32分孙铭徽复出 浙江广厦... 【搜狐体育战报】北京时间5月13日CBA季后赛,主场作战的浙江浙商证券以91-67击败山西汾酒,伤缺...
原创 外... 外汇储备被网友戏称为“金融核武”,因为其不仅在稳定汇率、保障经济安全上发挥关键作用,还有助于推动人民...
美股首只纯存储ETF,刷新华尔... 财联社5月13日讯(编辑 史正丞)近期存储芯片板块的猛烈上涨,使得一只成立不到6周的ETF成为华尔街...