我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言链接属性的实践应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言链接属性的实践应用

什么是链接属性

链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不同文件的标识符(即程序中定义的各种名称,包括变量名、函数名)是否是同一个实体。更通俗地说,就是在两个不同文件中的变量、函数声明是否指向同一个实体。比如:a、b文件同时声明了变量c,链接属性就指定了这两处变量c是否是同一个c。

简单来说,链接属性的作用就是让你能在a文件中决定要不要访问b文件中的变量、函数。

链接属性的分类

链接属性有三种:

  • external - 外部链接
  • internal - 内部链接
  • none - 无链接

对于external属性的标识符,不同文件中出现的多个同名称标识符指向同一个实体。在C语言中,用extern关键字在声明中指定以引用其他文件中定义的相同标识符

对于internal属性的标识符,仅在当前文件内该标识符指向同一个实体。在C语言中,用static关键字在声明中指定让标识符变为该文件私有(只有对原本缺省的链接属性为external的标识符,才能用static关键字改变其链接属性为internal)。

对于none属性的标识符,在每个声明位置都是一个新的实体。C语言中,没有对应的关键字。

默认的链接属性

标识符的默认的链接属性与其出现的位置有关。

  • 程序的全局变量、所有函数默认的链接属性为external。

  • 其余标识符的默认链接属性为none。

在以下例子中,b、c、f的链接属性就是external:

typedef char *a;
int b;
int c(int d)
{
	int e;
	int f(int g);
}

实践应用

extern

在a文件中想要使用b文件中定义的external属性标识符,可使用extern关键字在a文件中声明。

即使该标识符所在位置默认链接属性为external,也建议使用extern关键字显式说明,有利于增加程序可读性。

static

在a文件定义了一个全局标识符,但不想被其他文件访问,可以对该标识符加上static关键字。

在a、b文件中定义了同样的标识符,通过static关键字可以避免多重定义问题。

再次提醒:只有对原本缺省的链接属性为external的标识符,才能用static关键字改变其链接属性为internal

一些细节

  • 对于external属性的标识符,你可以在多个不同源文件中声明,但是你只能在一处初始化。否则就会出现重复定义的问题:multiple definition of 'a';
  • extern关键字声明的标识符用于访问其他文件中定义的同名的标识符,因此无法进行初始化。如果你对extern声明的变量进行初始化就会生成警告:warning: ‘a’ initialized and declared ‘extern’
  • 如果在其他文件中不存在相应的标识符定义,却在当前文件中使用了extern声明,会报错:undefined reference to 'a',原理同2。
  • external属性的标识符总是静态存储类型。
  • static关键字还有改变存储类型的作用,因此,其作用与上下文环境有关,只有对于默认链接属性为external的标识符,才有改变链接属性的作用。
  • C++中,const变量隐含的具有internal属性,C中并不具有这一性质。

思考题

internal和none属性除了作用域不同还有什么区别?

以下代码一定程度上阐释了部分区别:

static int i; // definition
              // static storage
              // internal linkage

void f(void)
{
    extern int i; // declaration
                  // refers to the static i at file scope
                  // note that even though the specifier is extern
                  // its linkage is intern (this is legal in both C/C++)
    {
        int i; // definition
               // automatic storage
               // no linkage
    }
}

实际上链接属性和作用域是两个概念。之所以产生以上问题,因为internal属性标识符出现的位置都是在文件作用域,而none往往在代码块作用域。此处想引起读者对内链接更深入的思考,见问题2。

文件作用域已经能让程序访问同一文件变量,那么再进行内部链接的意义在哪?

同一个标识符在链接中只能存在一个,那么通过内部链接的方式可以隔绝同名外部链接,且限定了外部编译单元不能访问该文件全局标识符。

a.c:

#include <stdio.h>

static int a=3;

int main(void)
{
    extern int a;
    printf("a=%d\n", a);
    return 0;
}

b.c:

int a=1;

编译后结果为:

a=3

以上仅为不完善的个人猜想,抛开隔绝外部链接这一点不谈,就内部链接这一名称而言,笔者对为什么要在同一个文件内部使用链接的设计仍然存疑,但目前该话题的答案超出了笔者的理解,因此更深入的讨论暂时留白。

拓展:感兴趣的同学可以尝试学习链接相关知识,或许会找到更确定的答案。

参考

  • 《Pointers On C》

  • Difference between internal and no linkage

总结 

到此这篇关于C语言链接属性的文章就介绍到这了,更多相关C语言链接属性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言链接属性的实践应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言链接属性怎么应用

小编给大家分享一下C语言链接属性怎么应用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是链接属性链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不
2023-06-29

Go语言开发区块链应用的探索与实践

Go语言开发区块链应用的探索与实践引言:随着区块链技术的快速发展,越来越多的开发者开始关注和实践区块链应用的开发。作为一门简洁高效的编程语言,Go语言由于其并发性能和安全特性的优势,成为了区块链开发的热门选择。本文将探讨在Go语言下开发区块
Go语言开发区块链应用的探索与实践
2023-11-20

C语言递归在实践题目中如何应用

本篇内容主要讲解“C语言递归在实践题目中如何应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言递归在实践题目中如何应用”吧!递归知识点递归概念:程序调用自身的编程技巧称为递归( recur
2023-06-30

C语言线性表链式表示及实现的方法

今天小编给大家分享一下C语言线性表链式表示及实现的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言线性表的顺序表示指的
2023-07-02

解析Go语言和C语言指针的特性及应用

Go语言和C语言是两种非常常见的编程语言,它们都支持指针的概念,但在使用方式和语法上有一些不同。本文将对Go语言和C语言的指针特性进行详细解析,并通过具体的代码示例来说明其应用。一、指针的定义和基本概念在C语言中,指针是一种特殊的数据类
解析Go语言和C语言指针的特性及应用
2024-03-07

实践和应用:Go语言的并发控制

编程网今天将给大家带来《实践和应用:Go语言的并发控制》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!《Go语言并发控
实践和应用:Go语言的并发控制
2024-04-04

C语言外部链接的静态变量怎么使用

这篇文章主要介绍“C语言外部链接的静态变量怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言外部链接的静态变量怎么使用”文章能帮助大家解决问题。外部链接的静态变量具有文件作用域、外部链接和
2023-06-27

探讨Go语言中SQL应用的实践经验

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《探讨Go语言中SQL应用的实践经验》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。Go语言作为一种快速、高效的编程语言在近年来受到了
探讨Go语言中SQL应用的实践经验
2024-04-04

Go语言开发实现智能供应链管理系统的实践经验分享

随着互联网技术的不断发展,物流行业也逐渐进入了智能化时代。智能供应链管理系统作为物流行业重要的信息化手段,可以提高供应链的效率和可靠性,为企业节省成本,提升服务质量。本文将分享一种使用Go语言开发实现智能供应链管理系统的实践经验。一、智能供
Go语言开发实现智能供应链管理系统的实践经验分享
2023-11-20

使用Go语言拼接字符串的最佳实践

使用Go语言拼接字符串的最佳实践在Go语言中,字符串的拼接是一项常见的操作。在进行字符串拼接时,我们需要考虑到性能和内存的消耗。本文将介绍一些在Go语言中进行字符串拼接的最佳实践,并提供具体的代码示例。使用 strings.Join()
使用Go语言拼接字符串的最佳实践
2024-03-13

Go语言在区块链应用开发中的关键技术与实践经验分享

Go语言在区块链应用开发中的关键技术与实践经验分享随着区块链技术的不断发展和普及,越来越多的开发者开始关注并使用Go语言来开发区块链应用。作为一种效率高、性能优越的编程语言,Go语言在区块链领域具有独特的优势。本文将通过分享关键技术和实践
Go语言在区块链应用开发中的关键技术与实践经验分享
2024-03-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录