关于C++中的包含编译模型和分别编译模型
2008-12-18 14:23
281 查看
这段时间在学习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.
"包含编译模型"并不是类模板的声明和定义放在一个头文件里;
"分离编译模型"也并不是将申明和定义分开.
看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.
"包含编译模型"并不是类模板的声明和定义放在一个头文件里;
"分离编译模型"也并不是将申明和定义分开.
相关文章推荐
- C++模板编译模型:包含编译模型
- C++模板编译模型:包含编译模型
- dev C++ 模板中的分别编译-- “包含”模型的一种解决方法
- C++学习笔记 模板 包含编译模式 分别编译模式
- 深入探索C++对象模型笔记一 —— 关于对象(上)
- 关于c/c++编译过程的参考
- 深入探索C++对象模型(1) 关于对象(思维导图)
- .NET下编译C++代码时出现fatal error C1083: 无法打开包含文件:“iostream.h”: No such file or directory错误的解决方法.
- 【C/C++】关于编译错误 "error C2146: syntax error : missing ';' before identifier 'xxx'"
- 关于c++头文件的重复包含
- 关于浙大OJ上的对C++的编译方式
- 本文是关于使用C++调用Matlab编译生成的Dll的说明
- 关于ubuntu下的c++编译
- 关于C++编译的程序无法在新一台电脑上运行总结
- GCC /G++ 分别用于编译C及C++源代码
- c++模板之声明定义分离编译模型
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 关于前置声明与C++中头文件相互包含的几点问题
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令
- C++ 工程实践(12):C++ 编译链接模型精要