c – 函数模板的多个定义

前端之家收集整理的这篇文章主要介绍了c – 函数模板的多个定义前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设头文件定义了一个函数模板.现在假设两个实现文件#include这个头,并且每个实现文件都有对函数模板的调用.在两个实现文件中,功能模板都以相同的类型实例化.
// header.hh
template <typename T>
void f(const T& o)
{
    // ...
}

// impl1.cc
#include "header.hh"

void fimpl1()
{
    f(42);
}

// impl2.cc
#include "header.hh"

void fimpl2()
{
    f(24);
}

可能期望链接器会抱怨f()的多个定义.具体来说,如果f()不是模板,那就是这样.

>链接器怎么没有抱怨f()的多个定义?
>在标准中指定链接器必须正确处理这种情况?换句话说,我可以总是指望类似于上面的程序来编译和链接
>如果链接器能够巧妙地消除一组函数模板实例化,为什么不能对常规函数执行相同的操作,因为它们与实例化函数模板的情况相同?

解决方法

为了支持C,链接器足够聪明,可以认识到它们都是相同的功能,并且抛出除了一个.

编辑:澄清:链接器不比较函数内容并确定它们是相同的.模板功能标记为这样,并且链接器识别出它们具有相同的签名.

猜你在找的C&C++相关文章