您的位置:首页 > 编程语言 > C语言/C++

c++中为什么不支持模板分离编译

2017-10-16 20:47 399 查看
模板为什么不支持分离编译

通常我们习惯于将函数分离编译,即:

对于一个函数fun 分离编译:

在xx.h中给出函数定义

在xx.cpp中完成函数

在xxmain.cpp中调用函数

先看一般情况下,编译器如何对函数分离编译:

--------------------------------------------------------------------------------------------------------------

1.编译:将xx.cpp,xxmain.cpp分别编译成xx.obj,xxmain.obj
而因为xxmain.cpp中没有对fun的实现,所以在

xxmain.obj中仅有一条call指令声明调用了fun函数,将fun当成外部链接函数处理

2.链接:在xx.obj中有fun函数的具体实现,编译器将xxmaim.obj 的call指令后的fun地址地址偏移到xx.obj中

fun的实际地址 编译成功。

再看编译器对模板的编译:

如果有通过模板创建的实体,就将模板参数带入,生成相应的二进制码。如果没有实例化,则不生成实际代码。

如果将模板分离编译,按照上面给出的步骤:

1.分别编译 因为此时xx.h,xx.cpp中都没有对模板函数的实例化,也就没有该函数的实际代码,也就没有函数的实际地址。

2.链接:在所有生成的.obj文件中都找不到函数的实际地址 链接错误

所以,因为模板分离编译时,在函数的实现文件中,没有对函数实例化,无法生成实际代码,链接时找不到函数的实际位置,出现链接失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: