C++模板声明与实现分开--由此想到的编译,链接原理

本文探讨了C++中模板声明与实现分开可能导致的链接错误问题,解析了编译和链接的基本原理。在编译阶段,每个源文件会被转化为汇编指令的obj文件,而链接阶段则负责合并obj文件并处理外部函数引用。当模板函数的实现不在同一文件中时,需要直接包含实现文件以避免找不到函数定义的错误。解决方案是在使用模板的地方包含实现文件,以便实例化模板函数。
摘要由CSDN通过智能技术生成

问题来源:当模板文件的实现与声明分开在不同文件中时,链接时会提示找不到相应模板函数,如下

一,编译和链接的大概原理:

1,编译,遍历工程的所有代码文件,进行文件分析,这里的分析与文件后缀无关,并不是说以CPP文件为依据,源文件后缀名可以改为任何名字。

编译以文件为单位,将此文件#include的所有文件拿进来,写进此文件中,包含进来的东西可能是函数声明,也可能是函数的实现体。

如果#include "test.h",则包含进来的是一些函数和变量的声明,如果 #include "test.cpp",则其中的函数实现代码也被包含进来了。

编译的结果是一个obj文件,如test.cpp编译后是一个test.obj文件,里面是汇编指令。

同时,编译器有了该文件的一个清单,里面保存了 【函数签名(声明)】到【函数体实现】的映射

2,链接,对所有的obj文件进行拼接。

为什么要拼接?对于每个obj文件,其中若调用了其它文件的函数(外部调用),就需要知道此外部函数的具体实现,这在编译时是不关心的。

这时候去所有obj文件中查找此外部函数的实现体,若有两个以上的obj都有此实现,则链接出错,因

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值