(C++)模板分离编译面对的问题

news2025/6/16 9:38:53

  • 什么是分离编译
  • 模板的分离编译

什么是分离编译

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

模板的分离编译

假如有以下场景,模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义:

//test.h
#include<iostream>
using namespace std;

//函数模板的声明
template<class T>
T Add(const T& left, const T& right);

//test.cpp
#include"test.h"
template<class T>

//函数模板的定义
T Add(const T& left, const T& right)
{
 return left + right;
}
//amin.cpp
#include"a.h"
int main()
{
 Add(1, 2);

 return 0;
}

如果模板进行分离编译会发现程序会出现链接错误,错误提示如下:
在这里插入图片描述正常的函数进行分离编译不会有任何问题,而函数模板进行分离编译却会出现链接错误,这是为什么?

我们都知道一个程序要先经过编辑、编译、链接,才能运行,而上面的模板分离编译的链接错误,不就是链接阶段发生的吗?那让我们一起看看链接之前会发生什么。
我们将一个程序的代码编辑完之后,就会进入编译阶段,而编译阶段又可以细分为预处理、编译、汇编,看看它们分别发生了什么?
预处理:源文件中头文件的展开/宏替换/条件编译/去掉注释

上面模板的分离编译中会将test.h在test.cpp和main.cpp中展开,那两个源文件中就都有了函数模板的声明,这一步是没有问题的。

编译:进行语法检查、生成汇编代码

在进行语法检查的时候,main.cpp中调用了模板函数,而在它调用之前已经有了函数模板的声明,说明语法没有问题,然后生成对应的汇编语言(要注意,调用函数肯定需要对应的函数地址,但现在只有函数的声明,那它的函数地址就是有待确定的)。而test.cpp中函数的定义在在这一阶段是需要被实例化的,但因为函数模板的模板参数无法确定类型,所以无法将函数模板实例化,也就无法生成对应的函数地址,那符号表中也就无法找到该函数的地址,但语法并没有问题(如果是普通函数,那就可以生成对应的函数地址)。

汇编:将汇编代码转换成机器码。其实只要上面的编译不检查出语法错误,那这一阶段就能进行。

经过以上阶段,就该进行链接了,前面main.cpp编译生成的汇编代码里待查的函数地址就要去符号表中找,但因为函数模板的定义并没有被实例化,符号表中并没有对应的函数地址,那main.cpp中调用的模板函数不就相当于找不到了吗,那就会报链接的错误

那如何解决呢?
方法一:既然是因为编译阶段test.cpp中函数模板无法确定类型而无法实例化,那我们可以保持模板分离编译不表,然后在test.cpp中显示实例化。加上如下代码:

template
double Add<int>(const int& left,const int& right);

这样虽然解决当前的问题,但如果调用函数时类型变成了double类型,那又得显示实例化,这样太麻烦了。

方法二:如果函数模板的声明和定义要分离也要都放在一个文件中(比如上面就是放在test.h中),那这样编译阶段就函数模板的模板类型可以确定,也就可以生成对应的函数地址。链接时就不会出问题了。很明显方法二更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java锁机制

Java锁机制1. 什么是锁JVM运行时内存结构2. 对象、对象头结构Mark Word中的字段3. synchronizedMonitor原理四种锁状态的由来4. 锁的4种状态4.1 无锁CAS&#xff08;Compare and Swap&#xff09;4.2 偏向锁实现原理4.3 轻量级锁如何判断线程和锁之间的绑定关系自旋4.4 重量级锁…

【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

前言 人脸检测的目标是找出图像中所有的人脸对应的位置&#xff0c;算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式&#xff0c;下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。 程序流程 代码 impo…

摩兽Pesgo plus首发爆卖,全网关注度破亿!中国潮玩跨骑电自浪潮已至?

2023年4月11日&#xff0c;TROMOX摩兽圆满举办了“跨骑潮电&#xff0c;大有所玩”Pesgo plus新品发布会。发布会在抖音、天猫、视频号平台进行了同步直播并开启线上预定。发布会直播当晚&#xff0c;摩兽Pesgo plus即狂揽线上订单&#xff0c;全网各大平台相关话题累计热度已破…

XXL-JOB分布式任务调度平台详细介绍

一、概述 在平时的业务场景中&#xff0c;经常有一些场景需要使用定时任务&#xff0c;比如&#xff1a; 时间驱动的场景&#xff1a;某个时间点发送优惠券&#xff0c;发送短信等等。 批量处理数据&#xff1a;批量统计上个月的账单&#xff0c;统计上个月销售数据等等。 固…

用SQL语句操作oracle数据库--数据查询(上篇)

SQL操作Oracle数据库进行数据查询 Oracle 数据库是业界领先的关系型数据库管理系统之一&#xff0c;广泛应用于企业级应用和数据仓库等场景中。本篇博客将介绍如何使用 SQL 语句对 Oracle 数据库进行数据查询操作。 1.连接到数据库 在开始查询之前&#xff0c;需要使用合适的…

素材管理系统概念导入

引言 由于工作上的调整安排&#xff0c;有幸参加营销素材管理系统的产品建设工作中&#xff0c;营销宣传领域一直是我的知识盲区&#xff0c;所以素材管理系统的产品建设对我来说是个富有挑战性的工作&#xff0c;在这过程中&#xff0c;我也秉持着“好记性不如烂笔头”的原则&…

Golang每日一练(leetDay0033) 二叉树专题(2)

目录 97. 交错字符串 Interleaving String &#x1f31f;&#x1f31f; 98. 验证二叉搜索树 Validate Binary Search Tree &#x1f31f;&#x1f31f; 99. 恢复二叉搜索树 Recover Binary Search Tree &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &am…

中国人工智能企业CIMCAI世界前三大船公司落地,智能船公司产品20秒AI自动验箱,箱信息箱况+精确地点报备智慧港航中国人工智能企业

中国人工智能企业CIMCAI世界前三大船公司落地&#xff0c;智能船公司产品20秒AI自动验箱&#xff0c;箱信息箱况精确地点报备智慧港航。小程序全时全域自动化箱况检测信息识别&#xff0c;CIMCAI全球领先新一代集装箱管理方案&#xff0c;人工智能AI自动化箱信息识别箱况检测地…

Python 小型项目大全 21~25

二十一、DNA 可视化 原文&#xff1a;http://inventwithpython.com/bigbookpython/project21.html 脱氧核糖核酸是一种微小的分子&#xff0c;存在于我们身体的每个细胞中&#xff0c;包含着我们身体如何生长的蓝图。它看起来像一对核苷酸分子的双螺旋结构&#xff1a;鸟嘌呤、…

【跟着陈七一起学C语言】今天总结:C语言的函数相关知识

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

太阳能电池板AI视觉检测:不良品全程阻断,高效助力光伏扩产

2022年&#xff0c;面对复杂严峻的国内外形势&#xff0c;我国光伏行业依然实现高速增长&#xff0c;多晶硅、硅片、电池片、组件产量稳居全球首位。2023年以来&#xff0c;扩产项目已多点开花。光伏装机量天花板将不断提升&#xff0c;分布式电站占比也将逐年上升。中国光伏行…

4月软件测试面试太难,吃透这份软件测试面试笔记后,成功跳槽涨薪30K

4 月开始&#xff0c;生活工作渐渐步入正轨&#xff0c;但金三银四却没有往年顺利。昨天跟一位高级架构师的前辈聊天时&#xff0c;聊到今年的面试。有两个感受&#xff0c;一个是今年面邀的次数比往年要低不少&#xff0c;再一个就是很多面试者准备明显不足。不少候选人能力其…

python学籍管理系统

1&#xff0c;创建登陆的首页面&#xff0c;且封装起来。LoginPage.py import tkinter as tk#导入tk模块 from tkinter import messagebox#导入消息提示模块 from tkinter import messagebox from db import db #导入数据库db class LoginPage:#把整个登陆页面创建一个class类…

搭建自己的饥荒Don‘t Starve服务器-饥荒Don‘t Starve开服教程

前言 饥荒这个游戏&#xff0c;虽然首发于2016年&#xff0c;但是贵在好玩呀。和Minecraft一样&#xff0c;可玩性很高&#xff0c;并且有很多mods&#xff0c;最近和小伙伴玩的过程中&#xff0c;就想着搭建一个服务器&#xff0c;方便在主机玩家不在线时候&#xff0c;也可以…

Linux软件安装---Tomcat安装

安装Tomcat 操作步骤&#xff1a; 使用xftp上传工具将tomcat的 二进制发布包上传到Linux解压安装包&#xff0c;命令为tar -zxvf apache-tomcat*** -C /usr/local进入Tomcat的bin的启动目录&#xff0c;命令为sh startup.sh或者./startup.sh 验证Tomcat启动是否成功&#xff0…

LeetCode:376. 摆动序列——说什么贪心和动规~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;376. 摆动序列 题目描述&#xff1a;如果连续数字之间的差严格地在正数和…

Python 小型项目大全 46~50

# 四十六、百万骰子投掷统计模拟器 原文&#xff1a;http://inventwithpython.com/bigbookpython/project46.html 当你掷出两个六面骰子时&#xff0c;有 17%的机会掷出 7。这比掷出 2 的几率好得多&#xff1a;只有 3%。这是因为只有一种掷骰子的组合给你 2&#xff08;当两个…

「 分布式技术 」一致性哈希算法(Hash)详解

「 分布式技术 」一致性哈希算法&#xff08;Hash&#xff09;详解 参考&鸣谢 一致性 Hash 算法原理总结 kylinkzhang&#xff0c;腾讯 CSIG 后台开发工程师 什么是一致性哈希&#xff1f; xiaolinCoding 文章目录「 分布式技术 」一致性哈希算法&#xff08;Hash&#xff…

imagenet val 按类别分类

前言 有时候想看imagenet下某个类别的效果&#xff0c;但它又没划分… 之前看了这篇文章将ImageNet的验证集val数据分类到不同文件夹中&#xff0c;但不是很清楚那代码。 本文基于它的代码去做更改 把这个下下来 https://raw.githubusercontent.com/soumith/imagenetloader.…

ChatGPT 有哪些神奇的使用方式?

在遇到 ChatGPT之前&#xff0c;我很难想象&#xff0c;仅仅不到30s就能做出一个PPT。 而且对于小白来说&#xff0c;这个PPT绝对是「有水准、能拿得出手」的那种。 下面就是我用ChatGPTMindShow做的一套以分享短视频玩法为主题的 PPT&#xff0c;我挑几页大家看一下。 上面这…