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

相关内容

热门资讯

银行板块早盘逆势活跃,银行ET... 7月13日早盘,市场震荡调整,银行板块逆势活跃。截至午间收盘,中证银行指数上涨1.5%,香港证券指数...
2026常州展厅设计公司深度分... 企业展厅在中期追加预算,并不是少数项目的偶发现象,而是很多企业在启动阶段就埋下的结果。尤其在常州这类...
测试市场极限!美国6家超大型A... 随着科技股、人工智能(AI)股近期调整,美股科技巨头发行的巨额规模债券近期也遭遇抛售压力。 今年,六...
2026年美团商家费用全面拆解... “上美团做个店,光开户和推广一年就要烧掉辆车?”这是2026年不少本地商家在数字化浪潮前最大的焦虑。...
金价、油价突发! 7月13日早盘, 国际油价大幅高开,截至北京时间6:22,布伦特原油涨3.55%, 报78.71美元...
英伟达CEO黄仁勋称AI智能体... 【CNMO科技消息】据CNMO科技了解,英伟达CEO黄仁勋近日在一场专访中谈及智能体与人的区别时表示...
李小冉徐佳宁被曝离婚 两人于2... 搜狐娱乐讯 7月13日,有八卦媒体发文爆料称李小冉和徐佳宁在前两年就已分居,并已于去年11月在北京办...
静待“七巨头”财报表现,纳指1... 文丨斯嘉特 David Scutt 编辑丨吴海珊 最近3个多月以来,纳斯达克100指数从3月下旬触及...
这3种早餐正在给血管“添堵”,... 现代保健报讯:“周大夫,我去年刚放了一个支架,这才一年,怎么又胸闷了?” 兰州慧源堂中医诊所里,60...
原创 2... 上周五,现货黄金小幅下行,随后在4100关口附近来回震荡,最终收跌0.11%,报4119.27美元。...
36氪首发 | 港中大博士、前... 作者 | 乔钰杰 编辑 | 袁斯来 硬氪获悉,深圳光之跃迁科技有限公司(Lumisition Rob...
期货交易中哪些因素导致成交量和... 在期货交易里,成交量和持仓量的变化是投资者极为关注的重要指标,它们能够反映市场的活跃度与投资者的参与...
重磅合资|双强联手,凯伦防火涂... 伴随国内基建升级、绿色建筑普及以及建筑消防安全规范化发展,高性能、环保型特种建材已然成为行业刚需。 ...
《扩大消费“十五五”规划》:扩... 国务院批复同意《扩大消费“十五五”规划》。《规划》提出,发展数字消费。促进数字消费高质量发展,深入推...
A股点燃PCB投资热,慧联电子... 随着PCB需求爆发,A股市场上相关并购、资产重组涌现。近日,新锐股份宣布拟以8亿元收购慧联电子80%...
基金忠言|新锐量化直线跳水,暴... 图片来源:视觉中国 蓝鲸新闻7月13日讯(记者 祁和忠)5月中旬以来,平安新锐量化突然直线跳水,单位...
原创 如... 作为知名经济学家,尤其是在金融市场流量很大的经济人物,其本身要做到完全独立其实难度不小,一旦其价值增...
服务出海提速意味着什么 商务部数据显示,今年1月份至5月份,知识密集型服务出口6677.5亿元,增长12.2%,其中,知识产...
期货交易中怎样在期货交易中平衡... 在期货交易里,合理地处理持仓与资金的关系是关乎交易成败的关键因素。期货市场具有高风险性和高杠杆性,若...
两市遭遇“黑色星期一”,红利飘... 7月13日两市遭遇“黑色星期一”,科技板块等全线重挫,三大指数低开低走。银行、煤炭等红利资产逆市坚挺...