关于C++中的包含编译模型和分别编译模型

本文探讨了C++模板的两种编译模型:包含编译模型与分离编译模型。详细解释了这两种模型如何工作,并提供了具体的代码示例。通过对比它们的不同之处,帮助读者更好地理解模板的编译过程。


这段时间在学习C++中的模板,在网上看到有对"包含编译模型"和"分别编译模型"的说法:


看C++ templates吧,里面对这个问题讨论得很详细。 
包含编译模型就是类模板的声明和定义放在一个头文件里 
分离模型就是和将声明与实现分开 
不过要用到export关键字




根据我对书中内容的理解:


标准C++为编译模板定义了两种模型:包含模型和分别模型,这两种方式很大程度上是相同的:类定义和函数声明
放在头文件中,而函数定义和成员定义放在源文件中.这两种模型不同之处在于,编译器怎样使用来自源文件的定义而已.


对"包含编译模型",可以通过在声明函数模板或类模板的头文件中添加一条#include指示使定义可用,
从而引入包含相关定义的源文件.如下:


---------------------
// header file utlities.h
#ifndef AAAA_H
#define AAAA_H
template <class T> int compare(const T&, const T&);
......
#include "utilities.cc"
#endif

=======---------------
//implementation file utlities.cc
template <class T> int compare(const T &v1,const T &v2)
{
  //implemente
  ......
}
-------------------

这一策略使我们能够保持头文件和实现文件分离.

本书的作者并不是说"包含编译模型"就是将申明和定义放在同一个头文件中.这里分别放在了utlities.h和utlities.cc中,
只是在utlities.h时用了#include "utlities.cc".


而"分离编译模型"只是在使用了关键字"export"来告诉编译器模板定义在哪里引用.
如果在头文件类声明中使用了export,则该头文件只能被源文件使用一次;
如果在实现文件中使用了export,有两种情况:

一种是在实现文件的开头加上
export template <class Type> class Xxxx;
#include "Xxxx.h"
//others definitions
....

这类情况中,导出类成员都会自动声明为导出.
另一种情况就是对个别成员声明要导出的,只能对个别成员使用export.


"包含编译模型"并不是类模板的声明和定义放在一个头文件里;
"分离编译模型"也并不是将申明和定义分开.




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值