《C和指针》笔记11: external和internal链接属性

news/2025/2/19 8:47:42/

当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是像Pascal那样表示同一个实体?还是表示不同的实体?标识符的链接属性 (linkage)决定如何处理在不同文件中出现的标识符。标识符的作用域与它的链接属性有关,但这两个属性并不相同。

链接属性一共有3种——external(外部)、internal(内部)和none(无)。它们具有的性质有:

  • 没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体。
  • 属于internal链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。
  • 属于external链接属性的标识符不论声明多少次、位于几个源文件都表示同一个实体。

在这里插入图片描述

如上图所示,在缺省情况下,标识符b、c和f的链接属性为external,其余标识符的链接属性则为none。因此,如果另一个源文件也包含了标识符b的类似声明并调用函数c,它们实际上访问的是这个源文件所定义的实体。f的链接属性之所以是external是因为它是个函数名。在这个源文件中调用函数f,它实际上将链接到其他源文件所定义的函数,甚至这个函数的定义可能出现在某个函数库。

关键字externstatic用于在声明中修改标识符的链接属性。如果某个声明在正常情况下具有external链接属性,在它前面加上static关键字可以使它的链接属性变为internal。例如,如果第2个声明像下面这样书写

static int b;

那么变量b就将为这个源文件所私有(这有点类似C++类里面的私有函数)。在其他源文件中,如果也链接到一个叫做b的变量,那么它所引用的是另一个不同的变量。类似的,你也可以把函数声明为static,如下:

static int c( int d )

这可以防止它被其他源文件调用。

要注意的是:static只对缺省链接属性为external的声明才有改变链接属性的效果。例如,尽管你可以在声明5前面加上static关键字,但它的效果完全不一样,因为e的缺省链接属性并不是external

在这里插入图片描述

extern关键字的规则更为复杂。一般而言,它为一个标识符指定external链接属性,这样就可以访问在其他任何位置定义的这个实体。上图中声明3为k指定external链接属性(它本身的缺省链接属性并不是external)。这样一来,函数就可以访问在其他源文件声明的外部变量了。

当用于具有文件作用域的声明时(参考博客《C和指针》笔记10:作用域 ),extern这个关键字是可选的。然而,如果你在一个地方定义变量,并在使用这个变量的其他源文件的声明中添加extern关键字,可以使其他人更容易理解你的意图。

在这里插入图片描述

extern关键字用于源文件中一个标识符的第1次声明时,它指定该标识符具有external链接属性但是,如果它用于该标识符的第2次或以后的声明时,它并不会更改由第1次声明所指定的链接属性。上图中的声明4并不修改由声明1所指定的变量i的链接属性。

总结:

关键字链接属性性质
externexternal① 不论声明多少次、位于几个源文件都表示同一个实体 ② 函数和代码块外的变量声明缺省默认是exteral属性③ 当作用域为文件作用域的时候可选(文件作用域里声明的变量)④用于标识符的第一次声明指定为external属性有效,第二次及以上无效
staticinternal①在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体,②只有在链接属性是extern的时候使用static关键字才会让改变属性生效
none被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体

参考

  1. 《C和指针》

http://www.ppmy.cn/news/1064449.html

相关文章

图像线段检测几种方法

1、方法一 当我将OpenCV提升到4.1.0时,LineSegmentDetector(LSD)消失了。 OpenCV-contrib有一个名为FastLineDetector的东西,如果它被用作LSD的替代品似乎很好。如果你有点感动,你会得到与LSD几乎相同的结果。 2、方…

Flink CDC数据同步

背景 随着信息化程度的不断提高,企业内部系统的数量和复杂度不断增加,因此,数据库系统的同步问题已成为越来越重要的问题。 缓存失效 在缓存中缓存的条目(entry)在源头被更改或者被删除的时候立即让缓存中的条目失效。如果缓存在一个独立的…

CrossOver 23 新功能介绍 CrossOver 23 版本更新了哪些功能

本次发布的CrossOver 23为用户带来了许多令人期待的新功能和优化,特别是对游戏方面的支持,更是让广大Mac游戏玩家兴奋。CrossOver 23包括对Wine 8.0.1的更新,带来了5000多处改动,对各种应用程序进行了改进。该版本还包括 Wine Mon…

Vue2向Vue3过度核心技术指令补充

目录 1 指令修饰符1.1 什么是指令修饰符?1.2 按键修饰符1.3 v-model修饰符1.4 事件修饰符 2 v-bind对样式控制的增强-操作class2.1 语法:2.2 对象语法2.3 数组语法2.4 代码练习 3 京东秒杀-tab栏切换导航高亮3.1 需求:3.2 准备代码:3.3 思路&…

芯科科技推出专为Amazon Sidewalk优化的全新片上系统和开发工具,加速Sidewalk网络采用

芯科科技为Sidewalk开发提供专家级支持 中国,北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日在其一年一度的第四…

功能强大的网站检测工具Web-Check

什么是 Web-Check ? Web-Check是一款功能强大的一体化工具,用于查找有关网站/主机的信息。目前仪表版上可以显示:IP 信息、SSL 信息、DNS 记录、cookie、请求头、域信息、搜索爬虫规则、页面地图、服务器位置、开放端口、跟踪路由、DNS 安全扩…

C#,《小白学程序》第四课:数学计算

1 文本格式 /// <summary> /// 《小白学程序》第四课&#xff1a;数学计算 /// 这节课超级简单&#xff0c;就是计算成绩的平均值&#xff08;平均分&#xff09; /// 这个是老师们经常做的一件事。 /// </summary> /// <param name"sender"></…

202308_思考总结

产品的思考&#xff1a; *.新一代产品的考虑 (1)上一代产品自己发现的问题&#xff0c;关注痛点问题--->可以依据上一代问题集构建测试用例&#xff0c;每代产品发布后迭代测试用例 (2)发布后用户反馈问题--->有两个点可以吸收&#xff1a;a.下一代用户迫切需求是什么…