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

来源:互联网 发布:eia天然气库存数据 编辑:程序博客网 时间:2024/05/07 14:52


这段时间在学习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.


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




原创粉丝点击