为什么typeid.name()使用GCC返回奇怪的字符以及如何使其打印未拼写的名称?

siv*_*udh 43 c++ gcc g++ rtti

我怎么运行这个main.cpp:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

通过使用GCC 4.4.4版进行编译:

g++ main.cpp
Run Code Online (Sandbox Code Playgroud)

我明白了:

4Blah
Run Code Online (Sandbox Code Playgroud)

在Visual C++ 2008上,我会得到:

struct Blah
Run Code Online (Sandbox Code Playgroud)

有没有办法让它只是打印Blahstruct Blah

ice*_*ime 61

返回name是实现定义的:甚至不需要为不同类型返回不同字符串的实现.

你从g ++得到的是一个装饰名称,你可以使用c++filt命令"demangle" 或__cxa_demangle.

  • 特别是`c ++ filt -t` (16认同)
  • 啊。该死的GCC。 (3认同)

Mar*_*ork 17

返回的字符串是实现定义的.

gcc正在做的是返回受损的名字.
您可以使用c ++ filt将损坏的名称转换为纯文本

> a.out | c++filt
Run Code Online (Sandbox Code Playgroud)

  • 举个例子:假设stdout的内容是`PFPFiiEiiE`,我们可以使用shell命令`echo "PFPFiiEiiE" | c++filt`,结果将是`int (* (*)(int, int))(int)`。 (3认同)
  • 您可能(例如在 Ubuntu 上)还需要添加 `--types` 来解析类型结束编码: `echo "PFPFiiEiiE" | c++filt --types` (2认同)

sbi*_*sbi 13

有没有办法让它只是打印

Blah还是struct Blah

std::typeinfo::name()不.结果未指明.它甚至可能为所有类型返回相同的字符串(或者实际上,所有类型的空字符串),并且实现仍然是符合标准的.你不能依赖它的结果.真的,我发现它唯一有用的是调试.

告诉我们你需要什么.通常特征就是你使用的.


Ada*_*eld 7

正如其他人所说,这里的结果是实现定义的,这意味着实现(即编译器工具链)可以自由地定义它想要的方式,只要它在某处记录即可.

从C++标准,第18.5.1/1节[lib.type.info]:

该类type_info描述了实现生成的类型信息.此类的对象有效地存储指向该类型的名称的指针,以及适合于比较两种类型的相等或整理顺序的编码值.类型的名称,编码规则和整理顺序都是未指定的,并且可能在程序之间有所不同.


小智 6

在 4Blah 中,4 是班级名称中的字母数。例如,如果您的类名称是 myEmptyClass 那么它将打印 12myEmptyClass。