【问题标题】:Diffrent typeid between platforms [duplicate]平台之间的不同类型[重复]
【发布时间】:2021-01-28 23:03:04
【问题描述】:

我不明白为什么这个程序使用相同的编译器在 Linux 和 Windows 之间产生不同的输出。在 Windows 中它输出 float 而在 Linux 中它输出 f

#include <typeinfo>
#include <iostream>

int main() {
        std::cout << typeid(float).name() << std::endl;
        return 0;
}

【问题讨论】:

  • 不保证名称是特定的,它可能在编译器之间有所不同,甚至可能在同一程序的不同执行之间有所不同。
  • 你读过documentation吗?
  • @Yksisarvinen:我不确定这一点,除非实现特别提到这是一种可能性。

标签: c++ linux windows clang typeid


【解决方案1】:

有办法解决这个问题。 boost has demangling 功能。

#include <iostream>
#include <boost/core/demangle.hpp>
#include <typeinfo>


int main()
{
    auto name = typeid(float).name();
    std::cout << name << std::endl;
    std::cout << boost::core::demangle(name) << std::endl;
    
    return 0;
}

简单demo

更复杂的demo

【讨论】:

    【解决方案2】:

    typeid 运算符返回来自std::type_info 的名称,描述为

    type_info 类保存关于类型的特定于实现的信息,包括类型的名称以及比较两种类型是否相等或排序顺序的方法。这是 typeid 运算符返回的类。

    因此,他们如何选择命名类型是特定于实现的。这在std::type_info::name 中再次得到加强

    返回一个实现定义的包含类型名称的以空字符结尾的字符串。不提供任何保证;特别是,返回的字符串对于多种类型可以是相同的,并且在同一程序的调用之间会发生变化。

    【讨论】:

      【解决方案3】:

      来自[expr.typeid]/1

      typeid 表达式的结果是静态类型 const std​::​type_­info 和动态类型 const std​::​type_­infoconst 的左值 name 其中 name 是公开的实现定义的类 派生自 std​::​type_info ,它保留了所描述的行为 在 [type.info] 中。 [...]

      名称是实现定义的。

      [type.info]/1 特别提到[强调我的]:

      type_­info 类描述类型信息由 实施。此类的对象有效地存储了指向 类型的名称,以及适合比较两者的编码值 相等或整理顺序的类型。 名称、编码规则和 类型的整理顺序都是未指定的,可能会有所不同 程序之间

      所指向的类型的名称未指定,并且不仅在实现之间而且甚至在程序之间(来自相同的实现)都可能不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多