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

news2024/9/25 21:30:14

当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是像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.coloradmin.cn/o/934890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专业设计必备:Zeplin for Mac免费下载,打造独具特色的作品

Zeplin是一款高效制图软件,可以帮助用户更好的设计及制作图片,为用户提供了标注、Style Guide、备注文档与简单的团队协作功能,还可以自动生成尺码标注、CSS 样式代码、导出图片等。 功能介绍 量身定制的资源,在一个位置 Zepli…

Rabbitmq的Shovel

Federation 具备的数据转发功能类似, Shovel 够可靠、持续地从一个 Broker 中的队列 ( 作为源端,即source)拉取数据并转发至另一个 Broker 中的交换器 ( 作为目的端,即 destination) 。作为源端的队列和作为目的端的交换器可以同时位于…

Python通过matplotlib动态绘图实现中美GDP历年对比趋势动图

随着中国的各种实力的提高,经常在各种媒体上看到中国与各个国家历年的各种指标数据的对比,为了更清楚的展示历年的发展趋势,有的还做成了动图,看到中国各种指标数据的近年的不断逆袭,心中的自豪感油然而生。今天通过Py…

2023.8.27 碎碎念

碎碎念系列更新 离上次更新快一个月了 随便写写 一、关于工作 公司项目应用端开发(了解了shell,awk等)公司自研APP维护 后续计划写一篇shell相关的博客 二、关于学习 最近把算法也捡起来了,虽然还是很菜,今天周赛…

回归预测 | MATLAB实现GWO-ELM灰狼算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GWO-ELM灰狼算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GWO-ELM灰狼算法优化极限学习机多输入单输出回归预测(多指标,多图)效果一览基本介绍程…

单片机电子元器件-数码管

数码管分类 共阳 把所有数码管的阳极接到一起形成公共阳极COM 数码管 共阳极COM 接到 5V 电源 共阴 把所有数码管的阴极接到一起形成公共阴极COM 数码管 共阴极COM 接到 地 GND 上 八段 数码管 和 七段数码管, 多了一个 小数点 DP 数码管显示原理 一个数码管如…

YOLO目标检测——肺炎分类数据集下载分享

肺炎分类数据集总共21000图片,可应用于:肺炎检测、疾病诊断、疾病预测和预警等等。 数据集点击下载:YOLO肺炎分类数据集21000图片.rar

Fooocus启动时modules报错的解决方法

原理:是由于其他程序的安装导致modules的版本不对,先卸载现有版本,再运行run.bat让其自动安装响应的modules版本。 1、cmd运行windows dos终端。 2、将Fooocus_win64_1-1-1035文件夹备份,rename为Fooocus_win64_1-1-1035backup文…

轻松上传、管理和分享图片——PicGo for Mac,你的最佳选择

作为一名经常使用图片的用户,你一定经历过图片上传、管理和分享的烦恼。PicGo for Mac是一款专为Mac用户设计的图片上传工具,它能够帮助你轻松完成这些任务。 首先,PicGo for Mac提供了一种简单而高效的方式来上传图片。你只需将图片拖放到Pi…

《网络是怎样连接的》(五)

本文主要取材于 《网络是怎样连接的》 第五章。 目录 5.1 Web服务器的部署地点 5.2 防火墙的结构和原理 5.3服务器负载平衡 5.4 使用缓存服务器分担负载 5.5 内容分发服务 简述:本文主要内容是解释 网络包如何朝服务器前进,并通过服务器前面的防…

VM——西门子Smart 200进行S7通信

1、参考文章《海康VisionMaster与西门子Smart 200进行S7通信_机器人自动化控制的博客-CSDN博客》 2、注意事项: (1)PLC设置的变量类型是VW,而不是MW。 (2)与S7一样,默认端口号是102&#xff…

深入剖析Kubernetes之控制器模式的实现-Deployment

文章目录 Deployment Deployment Deployment 实现了 Kubernetes 项目中一个非常重要的功能:Pod 的“水平扩展 / 收缩”(horizontal scaling out/in)。这个功能,是从 PaaS 时代开始,一个平台级项目就必须具备的编排能力…

在Windows操作系统上安装Neo4j数据库

在Windows操作系统上安装Neo4j数据库 一、在Windows操作系统上安装Neo4j数据库 一、在Windows操作系统上安装Neo4j数据库 点击 MySQL可跳转至MySQL的官方下载地址。 在VUE3项目的工程目录中,通过以下命令可生成node_modules文件夹。 npm install(1&am…

用U盘装Ubuntu22.04双系统前需要提前规避的两大问题

如果你是GPT分区,且Bios开启了UEFI(无论你选的是启动模式是LegacyUEFI还是UEFI,都算开启了UEFI)那你装Ubuntu时可以忽略本文,只看最末尾的装机教程 以下2个问题叠加,就会出现引导丢失的问题(版…

【持续更新中】QAGroup1

OVERVIEW Q&AGroup1一、语言基础1.C语言(1)含参数的宏与函数的不同点(2)sizeof与strlen的区别(3)大/小端(4)strcpy与memcpy的区别(5)extern与static的区别…

代码随想录算法训练营之JAVA|第三十九天|474. 一和零

今天是第39天刷leetcode,立个flag,打卡60天。 算法挑战链接 474. 一和零https://leetcode.cn/problems/ones-and-zeroes/ 第一想法 题目理解:找到符合条件的子集,这又是一个组合的问题。 看到这个题目的时候,我好像…

软件测试报告包含哪些内容?

软件测试报告一般包含以下内容: 1、引言(目的、背景、缩略语、参考文献) 2、测试概述(测试目的、项目介绍、测试目标) 3、测试资源(测试人员、测试软硬件环境及配置、测试环境的网络拓扑) 4…

【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)

背景需求: 2023年第一学期(2023年9-2024年1月),我又被安排为“机动班”,根据新学期的校历,手动推算本学期的机动班的带班表 排版原则 1、班级数量:共有6个班级,循环滚动 2、每周次…

集丰照明|这种灯光效果既简约又漂亮适合汽修洗车美容店

明亮的灯光,既能吸引客户上门,营造美观舒适的氛围。洗车美容店灯光方面既要满足基本的照明亮度,也要有图案、形状的美感。 下面是一家汽车服务店面不同区域的灯光效果,仅供想要开洗车店或者准备店面改造升级的朋友做参考。 灯光是…

Linux系统编程之文件编程常用API回顾和文件编程一般步骤

目录 1.打开文件 2.创建文件 3.写入文件 4.读取文件 5.光标定位 6.关闭文件 7.文件编程一般步骤 Linux系统提供了一些常用API如: 打开/创建 open/creat 读写 write /read 光标定位 Iseek 关闭 close 1.打开文件 参数说明 Pathname:要打开的文件名 (含路径&…