iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么理解C++内链接与外链接
  • 951
分享到

怎么理解C++内链接与外链接

2023-06-25 15:06:28 951人浏览 泡泡鱼
摘要

本篇内容主要讲解“怎么理解c++内链接与外链接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解C++内链接与外链接”吧!首先理解什么是编译单元?我们知道,其实编译器在编译代码时,只会去编译

本篇内容主要讲解“怎么理解c++内链接与外链接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解C++内链接与外链接”吧!

首先理解什么是编译单元?

我们知道,其实编译器在编译代码时,只会去编译.cpp格式的源文件,并且预编译器会递归的把.cpp所有#include的头文件都“拷贝”到.cpp文件中去,之后对这个文件再进行编译,生成二进制的.obj文件。那么其实每一个.cpp文件都是一个编译单元。

声明与定义

一个声明将一个名称引入一个作用域,C++中在同一个作用域中可以重复声明,除了类中的成员函数与成员变量的声明。以下都是声明:

Extern int number; //外部引用声明Typedef int  int32; // typedef声明Class A;          //类的前置声明Using std::cin;   //名字空间引用声明Friend f;         //友元声明Int testFun();    //函数前置声明

定义决定了一个实体在一个作用域的唯一描述,同一作用域不可以重复定义一个实体。以下都是定义:

Int a;Class Myclass{…};Myclass ma;Static int b;Enum{first, second,third};Const int m = 2;Void hello(){…}

什么是内部链接?

如果一个名称对于他的编译单元是局部的,并且在链接时不会与其他的编译单元中同样的名字冲突,那么这个名称就拥有内部链接。这个实体有内部链接,他就不会与其他.cpp文件同名的实体冲突。换个说法,那些编译单元(.cpp)中不能向其他编译单元(.cpp)展示提供其定义的函数、变量就拥有内部链接

那么哪些实体拥有内部链接?

      静态(static)全局变量,自由函数,友元函数定义

      类的定义

      内联函数定义

      UNIOn共用体定义

      名字空间的const常量定义

      枚举类型定义

      所有的声明(有人将声明归结为无链接)

什么是外部链接?

一个多文件的程序中,一个实体可以在链接时与其他编译单元交互,那么这个实体就拥有外部链接。

换个说法,那些编译单元(.cpp)中能想其他编译单元(.cpp)提供其定义,让其他编译单元(.cpp)使用的函数、变量就拥有外部链接

那么哪些实体拥有外部链接?

      类的非内联函数(包括成员函数和静态类成员函数)的定义

      类的静态成员变量的定义

      名字空间或全局的非静态的自由函数,非静态变量,非友元函数的定义

那么这里总结一下,定义这样的内链接与外链接有什么意义?

所谓链接,就是因为项目工程的不断扩大,写在一个.cpp文件即难以维护,又不好去合作开发。所以去将代码按照比较有条理的,分成多个文件,让其可以独立编译,在最后运行在整合到一起,也就是通过链接再去找到需要的代码。这时候就需要外链接定位到合适的代码。

比如我们定义的全局函数和变量,可以跨模块的链接使用。

有一些名字定义所表示的实体拥有外部链接,这样就意味着他可以跨越编译单元去进行代码的链接。所以,拥有外部链接的实体如果被声明在头文件并且被多个.cpp文件包含,可能就会出现链接冲突错误,因为每个包含这个拥有外部链接实体的.cpp都会分配空间,当多个编译单元链接的时候,连接器就会面对多个相同的名字,无法正常链接到正确的对象。

下面举个例子:(VS2012环境下)

//lesson.hnamespace lesson{         int  test;}//lesson.cpp#include "stdafx.h"#include "lesson.h"int _tmain(intarGC,_TCHAR*argv[]){         system("pause");         return0;}//test.cpp#include "lesson.h"

我们就会看到

error LNK2005: "intlesson::test" (?test@lesson@@3HA) 已经在 lesson.obj 中定义C:\Users\user\Documents\Visual Studio 2012\Projects\lesson\lesson\stdafx.obj

这样的错误提示。

而对于拥有内部链接的实体则不会出现这样的情况,因为他不会与其他.cpp的同名实体产生冲突。比如我们将上面的lesson.h改为

//lesson.hclass lesson{         int  test;}

这样就不会有任何错误,因为类的定义是有内部链接的。

如果在lesson.h里面再定义静态变量,枚举类,进行各种声明等,这些实体由于有内部链接所以仍然是合法的,编译器会认为你想在各个编译单元中都有一个私有的副本。

那么进一步的概括这些内容就是一句话  

相同作用域内的声明可以有多个,但是只能定义一次。

先不考虑内链接还是外链接,我们都知道一个{}里面不可能定义两个一模一样的名字。对于一个单独的.cpp文件,我们是知道的,但是对于多个文件,好像就稍微有点晕。其实,这是一个道理,我们的外部链接就是让各个.cpp文件能链接到一起,这样在.cpp文件遇到第一个{}之前,他们的作用域就可以理解为相同的,所以拥有外部链接的实体(全局函数,变量等)出现在第一个{}之前,而且名字相同,那就是出现了定义重复的错误。

我们再看,所有的声明都是有内部链接的,然而他其实可以链接到其他文件,因为他的定义是在其他的编译单元的,所以多个编译单元拥有相同的声明也是合理的。但是,我们知道,这个声明对应的定义肯定只有一个。

最后再给出一个C++编程建议,慎重考虑在头文件中定义有链接的实体

一,如果头文件是像int a=1;这样的定义,被包含在多个.cpp文件后肯定会报出链接错误。

二,如果是想static int a = 2;这样的定义就会在所有包含他的.cpp文件中生成一个副本,如果被大量源文件include的话,就会占据大量的空间,造成内存浪费。

到此,相信大家对“怎么理解C++内链接与外链接”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么理解C++内链接与外链接

本文链接: https://www.lsjlt.com/news/305747.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么理解C++内链接与外链接
    本篇内容主要讲解“怎么理解C++内链接与外链接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解C++内链接与外链接”吧!首先理解什么是编译单元?我们知道,其实编译器在编译代码时,只会去编译...
    99+
    2023-06-25
  • 深入理解C++内链接与外链接的意义
    上一篇博客给大家解释了“程序运行链接”的概念与意义,并区分了动态链接库与静态链接库。接下来想和大家谈一下C++的内链接与外链接的区别与意义。看完之后,希望你能理解以下几个问题~ 1....
    99+
    2022-11-12
  • 怎么理解Linux的硬链接与软链接
    这篇“怎么理解Linux的硬链接与软链接”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么理解Linux的硬链接与软链接”文...
    99+
    2023-06-16
  • C++静态链接与动态链接详解
    目录一、GCC工作流程二、静态链接与动态链接1、静态链接2、动态链接总结一、GCC工作流程 预处理:把#头文件展开,进行宏替换,去掉注释(生成.i文件) 编译:把预处理后的文件生成汇...
    99+
    2022-11-12
  • Linux硬链接与软链接原理及用法解析
    在linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。 硬链接概念 硬链接(ha...
    99+
    2022-06-03
    linux 硬链接 软链接
  • Vue.js中怎么处理外部链接
    这篇文章主要介绍“Vue.js中怎么处理外部链接”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue.js中怎么处理外部链接”文章能帮助大家解决问题。为什么要处理外部链接在处理外部链接之前,我们需要...
    99+
    2023-07-05
  • C++中怎么调用C链接库
    本篇文章给大家分享的是有关C++中怎么调用C链接库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++调用C链接库,其实相对C调用C++。因为C++本来就向下兼容C吧但由于编译...
    99+
    2023-06-17
  • Linux系统硬链接怎么理解
    本篇文章为大家展示了Linux系统硬链接怎么理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux系统中硬链接是什么呢?1、打开LINUX操作系统,可以使用UBUNTU。2、找到左边任务栏的终...
    99+
    2023-06-28
  • C语言外部链接的静态变量怎么使用
    这篇文章主要介绍“C语言外部链接的静态变量怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言外部链接的静态变量怎么使用”文章能帮助大家解决问题。外部链接的静态变量具有文件作用域、外部链接和...
    99+
    2023-06-27
  • C++存储链接性原理示例详解
    目录链接性外部链接性单定义规则内部链接性无链接性总结链接性 链接性是指名称在不同文件之间能否共享,而作用域是指名称在文件内部哪些范围可见。 这里的文件并非开发时创建的文件,而是将文...
    99+
    2023-01-03
    C++存储链接性原理 C++ 存储链接性
  • SQL语句中怎么创建外部链接
    本篇文章给大家分享的是有关SQL语句中怎么创建外部链接,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SQL语句之外部链接的创建:左连接(lef...
    99+
    2022-10-18
  • Linux系统中怎么使用ln命令创建软链接与硬链接
    Linux系统中怎么使用ln命令创建软链接与硬链接,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Linux 系统下每创建一个文件,系统都会为此文件生成一个 index no...
    99+
    2023-06-12
  • C#中怎么修改动态链接库
    这期内容当中小编将会给大家带来有关C#中怎么修改动态链接库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#实现修改动态链接库,将b修改为双重指针:public class RefCo...
    99+
    2023-06-17
  • C语言链接属性怎么应用
    小编给大家分享一下C语言链接属性怎么应用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是链接属性链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不...
    99+
    2023-06-29
  • CSS中怎么指定外部链接的样式
    CSS中怎么指定外部链接的样式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 大部分的信息类网站,比如维基百科,...
    99+
    2022-10-19
  • C# 中怎么设置Excel表格超链接
    本篇文章为大家展示了C# 中怎么设置Excel表格超链接,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。需要使用的工具:Free Spire.XLS for .NET 8.3 (社区版)Visual ...
    99+
    2023-06-03
  • 怎么使用C/C++生成的动态链接库
    这篇文章主要讲解了“怎么使用C/C++生成的动态链接库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C/C++生成的动态链接库”吧!操作环境:Visual Studio 2017.N...
    99+
    2023-06-26
  • linux软链接失效怎么解决
    当一个软链接失效时,可能有以下几种情况和解决方法:1. 目标文件被删除:如果软链接指向的目标文件被删除了,那么软链接就会失效。解决方...
    99+
    2023-10-12
    linux
  • vue跳转外部链接始终有localhost问题怎么解决
    这篇文章主要讲解了“vue跳转外部链接始终有localhost问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue跳转外部链接始终有localhost问题怎么解决”吧!vue跳转...
    99+
    2023-07-05
  • python怎么爬取网站所有链接内容
    要爬取一个网站的所有链接内容,你可以使用Python中的requests和BeautifulSoup库来实现。下面是一个简单的示例代...
    99+
    2023-08-14
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作