我怎么运行这个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)
有没有办法让它只是打印Blah或struct Blah?
ice*_*ime 61
返回name是实现定义的:甚至不需要为不同类型返回不同字符串的实现.
你从g ++得到的是一个装饰名称,你可以使用c++filt命令"demangle" 或__cxa_demangle.
Mar*_*ork 17
返回的字符串是实现定义的.
gcc正在做的是返回受损的名字.
您可以使用c ++ filt将损坏的名称转换为纯文本
> a.out | c++filt
Run Code Online (Sandbox Code Playgroud)
sbi*_*sbi 13
有没有办法让它只是打印
Blah还是struct Blah?
std::typeinfo::name()不.结果未指明.它甚至可能为所有类型返回相同的字符串(或者实际上,所有类型的空字符串),并且实现仍然是符合标准的.你不能依赖它的结果.真的,我发现它唯一有用的是调试.
告诉我们你需要什么.通常特征就是你使用的.
正如其他人所说,这里的结果是实现定义的,这意味着实现(即编译器工具链)可以自由地定义它想要的方式,只要它在某处记录即可.
从C++标准,第18.5.1/1节[lib.type.info]:
该类
type_info描述了实现生成的类型信息.此类的对象有效地存储指向该类型的名称的指针,以及适合于比较两种类型的相等或整理顺序的编码值.类型的名称,编码规则和整理顺序都是未指定的,并且可能在程序之间有所不同.