typeid 跨不同 dll 的结果

Posted

技术标签:

【中文标题】typeid 跨不同 dll 的结果【英文标题】:typeid result across different dll's 【发布时间】:2010-06-25 12:41:13 【问题描述】:

我有两个 dll 都声明了一个模板类型,我们称之为 A. 如果 A 的声明足够复杂,就会发生 在两个不同的函数中调用时 typeid(A).name() 的结果是不同的 dll。

示例:

DLL1:

struct MyType: public A< TEMPLATE_LIST_OF_A >

void f()
std::string name1 = typeid(A).name();

DLL2:

struct MyType: public A< TEMPLATE_LIST_OF_A >
    void f()
    std::string name2 = typeid(A).name();
    

例如 name1 可能类似于:“???MyType??? etc” 而 name2 可能是“???A??TEMPLATE_LIST_OF_A 等”。

这对我来说实际上很有意义,但是有没有办法,只要 使用的名称与保证 name1==name2 的名称相同?

谢谢, 抢

【问题讨论】:

【参考方案1】:

不仅没有办法保证typeid().name() 在不同的DLL 中是相同的,而且标准几乎不保证返回的字符串。具体来说,不能保证 a) 有意义,b) 对于不同类型是唯一的,c) 对于相同类型是相同的。

作为实现质量问题,您可能可以假设这三个条件成立,但特别是对于复杂的模板类型,如果您能找到在特定编译器中违反它们的情况,我不会感到惊讶。

98标准的相关部分是5.2.8和18.5.1

【讨论】:

【参考方案2】:

不,实际上有不同的类型(在我看来)。

typeid().name() 也是编译器特定的。

【讨论】:

【参考方案3】:

如果两个 DLL 使用完全相同相同的操作系统、编译器和编译器选项进行编译,那么 typeid 似乎很可能是相同的。

【讨论】:

以上是关于typeid 跨不同 dll 的结果的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符

C++-typeid-操作符

为啥 'typeid(x) == typeid(y)' 评估为真,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id 表达式?

typeinfo / typeid 输出

C++ 强制转换和 typeid