【发布时间】:2021-08-02 23:46:01
【问题描述】:
C++ 模板函数作为弱符号导出,以解决单一定义规则 (related question)。在为每个用例显式实例化函数的情况下,有没有办法将符号导出为非弱?
示例用例:
// foo.hpp
template<typename T>
void foo();
// All allowed instantiations are explicitly listed.
extern template void foo<int>();
extern template void foo<short>();
extern template void foo<char>();
// foo.cpp
template<typename T>
void foo()
{
// actual implementation
}
// All explicit instantiations.
template void foo<int>();
template void foo<short>();
template void foo<char>();
当我用 GCC 或 ICC 编译上面的代码时,它们被标记为弱:
$ nm foo.o
U __gxx_personality_v0
0000000000000000 W _Z3fooIcEvv
0000000000000000 W _Z3fooIiEvv
0000000000000000 W _Z3fooIsEvv
有没有办法防止这种情况发生?由于它们实际上是确定的,我不希望它们成为替代品。
【问题讨论】:
-
您为什么希望其他实例化有所不同?在这种情况下,我们的想法是,符号弱并不重要,因为它们都有相同的定义。
-
弱并不意味着“可以替代”。这意味着完全相同的候选人,其中任何一个都与其他任何一个一样好,因为它们是相同的。
-
您要解决什么问题?为什么要阻止它?
-
感谢 cmets。我同意最终的二进制文件并不重要。据我所知
weak表示该符号可以在链接期间与另一个同名符号进行切换;不需要相同的实现。它与模板一起使用以避免违反 ODR,因为模板实例化往往出现在许多目标文件中。我试图解决的问题是链接时间太慢,我想将链接器的工作减少到最低限度。