1.C/C++ 传统编译模型
函数/变量 声明和定义分开存放,声明放在头文件,定义放在C文件或者CPP文件
优点
- 发行商发行头文件,源代码不公开
- 头文件越小,编译时间越短
如果函数定义或者变量定义在头文件中,会造成编译错误,典型代码如下:
/*h.h*/
int val;
void bar()
{
}
/*b.cpp*/
#include "h.h"
/*a.cpp*/
#include "h.h"
int main()
{
return 0;
}
2. C++ 模板包含模型
2.1 包含模型
- 模板不是源代码,而是生成代码的指令。因此可以被重复包含在cpp文件中,而不会发生重定义问题
举例:

/*h.h*/
template <typename T>
T const Min(T a, T b)
{
return (a>b) ? b : a;
}
/*b.cpp*/
#include "h.h"
#include <iostream>
void fool()
{
using namespace std;
cout << Min<int>(10,100) << endl;
}
/*a.cpp*/
#include "h.h"
#include <iostream>
void bar()
{
using namespace std;
cout << Min <int> (10,100) << endl;
}
void fool();
int main()
{
fool();
bar();
return 0;
}
2.2 包含模型优化
模板编译非常耗时。而上述包含模型每一个cpp文件都会进行一次模板实例化,因此非常浪费时间!
模板在h_inst.cpp 中进行实例化

注意:a.cpp b.cpp如果使用某种实例化版本,在h_inst.cpp中应当有对应的特化版本,否则将发生未定义错误
/*h.h*/
template <typename T>
T const Min(T a, T b);
/*h.cpp*/
#include "h.h"
template <typename T>
T const Min(T a, T b)
{
return a>b? b : a;
}
/*h_inst.cpp*/
#include "h.cpp"
template int const Min<int>(int , int );
template double const Min<double>(double , double );
/*b.cpp*/
#include "h.h"
#include <iostream>
void fool()
{
using namespace std;
cout << Min<int>(10,100) << endl;
}
/*a.cpp*/
#include "h.h"
#include <iostream>
void bar()
{
using namespace std;
cout << Min <double> (1.1,2.2) << endl;
}
void fool();
int main()
{
fool();
bar();
return 0;
}
运行结果:

2.3 分离模型/显示实例化(编译器需要支持export)
这是最简单的模型,但是编译器设计十分困难!

/*h.h*/
template <typename T>
T const Min(T a, T b);
/*h.cpp*/
#include "h.h"
export template <typename T>
T const Min(T a, T b)
{
return a>b? b : a;
}
/*a.cpp*/
#include <iostream>
#include "h.h"
using namespace std;
int main()
{
cout << Min<int> (10,100) << endl;
cout << Min<double> (10.1,10.2) << endl;
return 0;
}
CNU编译器结果:不支持export关键字

345

被折叠的 条评论
为什么被折叠?



