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,也需要按照这种方式来组织文件。

相关内容

热门资讯

原创 母... 赵珈琪如今的生活令人羡慕,她是国家一级演员,家中几乎每一位亲人都与演艺圈有着深厚的渊源。她的丈夫虽然...
首席展望|摩根大通刘鸣镝:A股... 来源:澎湃新闻 【编者按】 2026年是“十五五”开局之年,中国经济步入新发展阶段。 新形势下,外资...
怎么看全球产业格局之变 怎么看全球产业格局之变 刘振中 百年变局加速演进,世界经济版图深度调整,全球产业格局正经历一场系统性...
量子互联网成为网络新前沿 当互联网首次将全球计算机连接起来时,它彻底改变了社会,尤其是人与人之间的沟通方式。如今,我们正站在另...
国乒全主力出征新加坡大满贯 男... 北京时间2月20日,2026年WTT新加坡大满贯赛女单、男单签表出炉。 新加坡大满贯赛国乒全主力出征...
原创 有... 仔细想想这几年,日子过得真有点儿微妙。 房价稳了但没那么火热了,工作岗位好像更多样却也更挑人,买东西...
原创 活... 繁华都市的街头巷尾,昔日熙攘的店铺如今却悄然显露疲态。放眼望去,“旺铺转让”的告示随处可见,许多曾经...
原创 黄... 2026年2月19日,国际伦敦现货黄金报价为每盎司4903美元,国内黄金实时价格为每克1084元,白...
纠治“抢票神器”“哄抬价格”等... 来源:央视 记者今天从市场监管总局了解到,春节假期,节日消费、旅游服务等市场火热。为维护春节期间市场...
解锁区块链世界:公有链翻译的知... 在信息技术飞速发展的今天,公有链作为区块链技术的重要分支,正逐渐渗透到金融、供应链、数字身份等多个领...
河南蒙古族自治县必须品尝的小吃... 在广袤的中国大地上,河南蒙古族自治县宛如一颗璀璨的明珠,散发着独特的民族文化魅力。而当地的小吃,更是...
原创 与... 作品声明:内容仅供参考,如有不适及时就医 双相情感障碍是一种长期的精神疾病,其特征是情绪波动剧烈,...
洛阳市孟津区筑牢基层网底 加强... 近日,记者从洛阳市孟津区卫生健康委获悉,孟津区以乡村一体化管理为主线,深化“乡聘村用”改革,强化大学...
原创 黄... 2月18日,国内黄金现货价1104元/克,白银18.9元/克,品牌零售价显著高于水贝批发价,周大福等...
“全款买房”和“贷款30年”,... 大家好,在进入正文之前,给大家做一个推荐。 我的一个设计师好友夏夏,从LXD离职后,经历过设计创业的...
港股马年首秀:智谱暴涨43%市... 大年初四(2月20日),当A股仍在享受春节假期时,港股已率先敲响马年交易的锣声。这匹"金融骏马"的首...
突发! 某大型国有汽车集团原董... 2026年2月,临近60岁法定退休年龄的方红卫终未等来功成身退。 从车间技术员到陕汽控股董事长,方红...
【首都除夕 护卫健康】最暖“年... 春节万家团圆、灯火可亲,而对于北京朝阳医院急诊医学中心的医护人员来说,这个节日往往意味着更重的责任与...
门窗紧闭容易“攒”出一身病,医... 过年了,走亲访友、家人团聚,屋里热热闹闹,门窗也关得严严实实。可待久了,不少人开始觉得头昏脑涨、胸闷...
全年减少6768亿元,3个现象... 开篇先给大家讲个故事,我一个发小在某个二线城市买了一套房,买房那一年正好是2019年,当时这个城市房...