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

这篇具有很好参考价值的文章主要介绍了《C和指针》笔记11: external和internal链接属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

《C和指针》笔记11: external和internal链接属性,C和C++,c语言,链接属性,external,internal

如上图所示,在缺省情况下,标识符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

《C和指针》笔记11: external和internal链接属性,C和C++,c语言,链接属性,external,internal

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

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

《C和指针》笔记11: external和internal链接属性,C和C++,c语言,链接属性,external,internal

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

总结:

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

参考文章来源地址https://www.toymoban.com/news/detail-684429.html

  1. 《C和指针》

到了这里,关于《C和指针》笔记11: external和internal链接属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C现代方法(第11章)笔记——指针

    —— 我记不清第十一条戒律是“你应该计算”还是“你不应该计算”了。 指针 是 C 语言最重要——也是最常被误解——的特性之一。由于指针的重要性,本书将用 3 章的篇幅对其进行讨论。本章侧重于基础知识,而第12章和第17章则介绍 指针的高级应用 。 本章将从 内存地

    2024年02月07日
    浏览(36)
  • 【C语言__指针01__复习篇11】

    目录 前言 一、什么是指针 二、计算机中常见的单位 三、CPU是怎样找到一块内存空间的 四、如何得到变量的地址 五、指针变量 六、解引用指针变量的作用 七、指针变量的大小 八、指针变量类型的意义         8.1  指针的解引用         8.2  指针+-整数 九、void*指针

    2024年04月25日
    浏览(30)
  • 出现 “‘mysql’ is not recognized as an internal or external command, operable program or batch file解决方法

    在 Windows 系统的 DOS 窗口通过命令行的方式登录 MySQL,出现 “‘mysql’ is not recognized as an internal or external command, operable program or batch file” 的提示 意味着系统无法识别或找不到 MySQL 的可执行文件 。这可能是由于以下几个原因导致的: MySQL 未正确安装:确保 MySQL 已正确安装并

    2024年02月07日
    浏览(52)
  • 微信小程序开发学习笔记——2.11navigator页面链接导航

    跟着b站up主“咸虾米_”学习微信小程序开发中,把学习记录存到这方便后续查找。 课程连接: https://www.bilibili.com/video/BV19G4y1K74d?p=14 https://developers.weixin.qq.com/miniprogram/dev/component/navigator.html 属性之一          navigate可以记录上一个缓存页,点击左上角返回按钮可以跳转回

    2024年02月22日
    浏览(48)
  • 【ARM 嵌入式 编译系列 4.2 -- GCC 链接规范 extern “C“ 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.1 – GCC 编译属性 likely与unlikely 学习 下篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 介绍 extern “C” 是一种链接规范,它用于告诉C++编译器按照C语言的方式来链接代码。这个主要用于在C++代码

    2024年02月13日
    浏览(59)
  • C语言K&R圣经笔记 5.6指针数组;指针的指针

    因为指针本身也是变量,所以它们也能像其他变量一样保存在数组里面。我们写个程序来说明,该程序将一些文本行按照字母顺序排列,算是 UNIX 程序 sort 的精简版本。 在第三章中,我们介绍了对一个整数数组进行排序的 Shell 排序函数,而在第四章中,我们用快速排序对其

    2024年02月03日
    浏览(47)
  • 【C语言】指针知识点笔记(2)

    目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

    2024年01月18日
    浏览(43)
  • Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)

         Android11 + RK3566 + AndroidStudio Android 权限的变化, 几乎每个版本的SDK都会有, 其中最大的一次是在6.0时, 增加的动态权限申请 读写存储的权限也几经更迭, 对开发人员来说, 越来越难.比如, 本文所要讨论的: 允许管理所有文件 首先是 targetSdkVersion 大于等于 30. (build.gradle) 当声

    2024年01月16日
    浏览(43)
  • C语言-外部关键字extern

    extern  extern 用在全局变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。  什么是定义,什么是声明?       什么是定义:所谓的定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名。但注意,这个名

    2024年02月07日
    浏览(46)
  • C语言 extern “C“的作用

    在看代码的时候遇到了这个问题。但是可能由于C++编译器版本的原因,我并没有成功地复现出这个问题,索性记录一下问题本身。 extern \\\"C\\\" 主要是用于在Cpp文件中调用C的函数。 C++支持函数的重载,但是C不支持。 C++编译器对这些同名不同参的重载函数的处理方法是,改写函数

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包