C++模板编译模型:包含编译与分离编译

本文介绍了C++中模板的两种编译模型:包含编译模型和分离编译模型,并详细解释了每种模型的应用场景及最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般而言,调用函数时,编译器只需要看到函数的声明即可。

所以可以把函数的声明放在.h 文件中,实现在.cpp 的实现文件中;  使用函数的地方#include 函数的h 文件即可。故一般的风格是件类定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。


对于模板则不同,要进行实例化,编译器必须能够访问模板定义的源代码。


为了在模板中也实现一般的声明定义分离,C++提供了两种模板的编译模型


1.  包含编译模型

在头文件中 使用#include 将源文件包含进来,这样编译器在编译时就可以看到模板的定义


所以编译器都支持这种编译模型


template.h 文件内容:

#pragma once


template<typename T>
int compare(const T& v1, const T& v2);

#include "template.cpp"

template.cpp 文件内容:

#pragma once
#include "stdafx.h"

template<typename T> int compare(const T& v1, const T& v2)
{
	if (v1 < v2) return 1;
	else if (v1 == v2) return 0;
	else return -1;


}



main 文件内容:

#include"template.h"



//test code
int main()
{
	std::cout << compare(3, 4) << std::endl;

	return 0;

}



2. 分离编译模型

声明和定义分离,  定义中使用export 关键词

#pragma once
#include "stdafx.h"

export template<typename T> int compare(const T& v1, const T& v2)
{
	if (v1 < v2) return 1;
	else if (v1 == v2) return 0;
	else return -1;


}


部分编译器支持export 关键词, 悲剧的是目前使用的VS2015 不支持export 

gcc  也不支持export 

目前知道的Intel parallel studio  最新版是支持的



3. 包含编译模型的最佳实践

模板的包含模型可以有多种实践方式:

   1.  模板声明在.h 文件,实现在.ccp 文件  ;   .h   文件中最后加入一行#include 将cpp 文件包含进来,使用模板时,#include .h 文件即可

    2.  模板声明在.h 文件中,实现在.cpp 文件中, 使用模板时,#include 模板的.cpp 文件

   3.    模板的声明和实现都放在.h 文件中,使用模板时,#include 模板的.h 文件


目前看来,比较好的实践是将模板的声明和实现都放在.h 文件中,使用模板时#include .h 文件

前两种方式因为存在cpp 文件,会多编译出一个obj 文件




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值