文章目录
一、C++ 联编概念
1、联编引入
" 联编 " Linkage 指的是 将 程序模块 和 代码 互相关联的过程 , 将不同源文件中的 同名函数 或 变量 进行链接 ;
在 C++ 语言中 , 每个 函数 或 变量 都有一个 链接属性 , 该链接属性决定了该 函数 或 变量 是否可以在其他源文件中使用 ;
联编 是通过 声明函数或变量 的 链接属性 进行控制 ;
- 如果一个 函数或变量 具有外部链接属性 , 则可以在其他源文件中使用该函数或变量 ;
- 如果一个 函数或变量 具有内部链接属性 , 则只能在其所在的源文件中使用该函数或变量。
2、链接属性 ( 内部链接 | 外部链接 )
C++ 中的 链接属性 有两种 : 内部链接 和 外部链接 ;
- 内部链接 : 使用 static 关键字 声明 函数 或 变量 , 该 函数 或 变量 就具有了 内部链接 属性 ; 具有 内部链接 属性的函数或变量 只能在其所在的源文件中使用 , 不能在其他源文件中使用 ;
- 外部链接 : 没有使用 static 关键字 声明 函数 或 变量 , 该 函数或变量 就具有了 外部链接 属性 ; 具有 外部链接 属性的函数或变量 可以在其他源文件中使用 , 使用前需要再这些源文件中声明 函数或 变量 ;
3、联编 ( C++ 语言 ) 与 链接 ( C 语言 )
C++中的 联编概念 与 C 语言中的 链接概念 :
- 链接 : 在 C 语言中 , 链接 是指在 编译时将不同源文件中的函数和变量链接在一起的过程 , 具体指的是 将 二进制的 .o 机器码文件 , 与 .a 静态库 或 .so 动态库 , 拼装成可执行文件 ;
- 联编 : 在 C++ 中 , 联编 是在编译时进行的 , 即使函数或变量的链接属性为外部链接 , 也需要在其他源文件中进行声明才能使用 ;
C 语言编译过程 参考 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 ) 博客 ;
链接操作 是 将 二进制的 .o 机器码文件 , 与 .a 静态库 或 .so 动态库 , 拼装成可执行文件 ;
4、静态联编
静态联编 是指在 编译时 确定的 变量 和 函数 的 链接关系 ,
由 编译器 根据 函数和变量的声明 以及它们所在的 源文件 来确定它们之间的 链接关系 ;
在 C++ 语言中 , 所有的 函数和变量 默认都具有 外部链接 属性 ,
因此 , 只要在 不同的源文件 中 声明了相同的函数或变量名 , 就可以在 链接 时将它们 链接 在一起 ;
5、动态联编
" 动态联编 " 是指在 运行时 确定的 链接关系 , 它是由 程序 在 运行时 根据需要 动态地 加载和链接 不同的模块 ;
C++ 语言中 没有 直接支持 动态联编 的特性 , 但可以使用 动态库 技术来实现动态链接 ;
进行 动态链接 时 , 使用 外部链接 属性的 函数或变量名 来 链接 不同的模块 ;
静态联编 和 动态联编 是两种不同的链接方式 , 其 链接时间 和 链接方式 都不同 ;
- 静态联编 发生在 编译时 ;
- 动态联编 发生在 运行时 ;
二、多态实现原理 - 联编 与 virtual 关键字
如果 函数前 不使用 virtual 关键字 修饰 , 就是 静态联编 ;
也就是 该 不使用 virtual 关键字 修饰的 函数, 在 编译器 编译阶段 , 就已经确定了 , 如何执行该函数 , 之后就无法修改了 ;
在 " 多态 " 中 , 如果 使用 virtual 关键字 修饰 函数 , 该函数就是 动态联编 ;
在 编译时 , 不确定 执行 哪个函数 ,
在 运行时 , 才确定 要执行 哪个 函数 ;