为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如何让它打印未损坏的名称?
为什么当我运行这个 main.cpp
时:
#include <iostream>
#include <typeinfo>
using namespace std;
struct Blah {};
int main() {
cout << typeid(Blah).name() << endl;
return 0;
}
通过使用 GCC 版本 4.4.4 编译它:
g++ main.cpp
我得到这个:
4Blah
在 Visual C++ 2008 上,我会得到:
struct Blah
有没有办法让它只打印 <代码>Blah 还是struct Blah
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
name
的返回是实现定义的:甚至不需要实现为不同类型返回不同的字符串。你从 g++ 得到的是一个 修饰名称,你可以使用
c++filt
命令或__cxa_demangle
。The return of
name
is implementation defined : an implementation is not even required to return different strings for different types.What you get from g++ is a decorated name, that you can "demangle" using the
c++filt
command or__cxa_demangle
.返回的字符串是实现定义的。
gcc 正在做的是返回损坏的名称。
您可以使用 c++filt 将损坏的名称转换为纯文本
The string returned is implementation defined.
What gcc is doing is returning the mangled name.
You can convert the mangled name into plain text with c++filt
否。
std::typeinfo::name()
的结果未指定。它甚至可能为所有类型返回相同的字符串(或者实际上,为所有类型返回空字符串),并且实现仍然符合标准。您不能依赖其结果。确实,我发现它唯一有用的就是调试。告诉我们您需要它做什么。通常,您可以使用特征来代替。
No. The result of
std::typeinfo::name()
is unspecified. It might even return the same string for all types (or, indeed, empty strings for all types) and the implementation would still be standard-conforming. You must not rely on its result. Really, the only thing I found it useful for was debugging.Tell us what what you need it for. Often traits is what you use instead.
正如其他人所说,这里的结果是实现定义的,这意味着实现(即编译器工具链)可以自由地定义它,只要它在某处记录即可。
来自 C++ 标准,第 18.5.1/1 节 [lib.type.info]:
As others have said, the result here is implementation-defined, meaning that the implementation (i.e., the compiler toolchain) is free to define it how it wants, so long as it documents that somewhere.
From the C++ standard, section 18.5.1/1 [lib.type.info]:
在 4Blah 中,4 是班级名称中的字母数。例如,如果您的类名称是 myEmptyClass 那么它将打印 12myEmptyClass。
in 4Blah, 4 is the number of letters in your class name. For example if your class name is myEmptyClass then it would print 12myEmptyClass.
typeid().name()
取决于实现。它甚至可能为每种类型返回空字符串。这不会是非常有用的实现,但它是有效的。typeid().name()
is implementation dependent. It may even return empty string for every type. That would not be very useful implementation, but it would be valid.使用 ./a.out | c++filt --GCC 的类型。
欲了解更多信息,请点击下面的链接。
https://sourceware.org/binutils/docs/binutils/c_002b_002bfilt.html#:~:text=%20c%2B%2Bfilt%201,that%20他们%20可以%20be%20阅读。 &text=如果%20将%20名称%20解码为%20,则%20原始%20单词%20就是%20输出。
Use ./a.out | c++filt --types for GCC.
For more information follow the links below.
https://sourceware.org/binutils/docs/binutils/c_002b_002bfilt.html#:~:text=The%20c%2B%2Bfilt%201,that%20they%20can%20be%20read.&text=If%20the%20name%20decodes%20into,the%20original%20word%20is%20output.