最简单的情况就拿模板来说,模板从本质上来讲很像宏,当模板在·个编译单元里被实例化时,它并不知道自己是否在别的编译单元也被实例化了。...可以想象一个有几百个编译单元的工程同时实例化了许多个模板,最后链接的时候必须将这些重复的代码消除掉,否则最终程序的大小肯定会膨胀得很厉害。
地址较易出错。有可能两个指向同一个函数的指针会不相等。...比如有个模板函数是ad(),某个编译单元以int类型和float类型实例化了该模板函数,那么该编译单元的日标文件中就包含了两个该模板实例的段。...这样,当别的编译单元也以int或foat类型实例化该模板函数后,也会生成同样的名字,这样链接器在最终链接的时候可以区分这些相同的模板实例段,然后将它们合并入最后的代码段。...对于C语言的目标代码来说,以下几个方面会决定目标文件之间是否二进制兼容:
内置类型(如int、float、char等)的大小和在存储器中的放置方式(大小端、对齐方式);
组合类型(如 struct、 union