我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:刘伯温论坛 > 分别编译 >

转C++分离式编译模型

归档日期:07-22       文本归类:分别编译      文章编辑:爱尚语录

  c++开发中广泛使用声明和实现分开的开发形式,其编译过程是分离式编译,就是说各个cpp文件完全分开编译,然后生成各自的obj目标文件,最后通过连接器link生成一个可执行的exe文件。

  可以看到有一条语句call _Z3funv,这条语句表明调用了fun函数,这就说明,在编译main.cpp的时候,不需要知道fun函数的具体实现,只需要有个声明,然后会有一条call的指令,在链接的时候去其他的文件中寻找fun函数的具体实现,如果在链接的时候找不到这样一个fun函数,将会发生一个链接期错误。

  然而,对于模板,你知道,模板函数的代码其实并不能直接编译成二进制代码,其中要有一个实例化的过程。通常而言,并不是把模板编译成一个可以处理任何类型的实体,而是对于实例化模板的每种类型,都从模板产生出一个不同的实体。这种用具体类型代替模板参数的过程叫做实例化。它产生了一个模板的实例。只要使用函数模板,(编译器)会自动地引发这样一个实例化过程,因此程序员并不需要额外地请求对模板的实例化。

  在编译main.cpp的时候,文件中只有f的声明,所以只能寄托于在链接的时候找到f的实现,然而在链接的时候main能在test.cpp的目标文件中找到f的实现吗?这是不能的,由于是分离编译的,在编译test的时候,f函数并没有被使用到,所以也不会被实例化,没有被实例化就找不到对应的代码段,所以在链接的时候编译器就傻眼了。这就是为什么模板不能分离编译的原因。

  关键是:在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找[当遇到未决符号时它会寄希望于连接器]。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能具现化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。

本文链接:http://saltstudios.net/fenbiebianyi/696.html