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运算符
为啥 'typeid(x) == typeid(y)' 评估为真,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id 表达式?