Nav*_*K N 17 c++ g++ name-mangling typeid
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在我的ubuntu机器上用g ++ 打印P3foo.我不知道它为什么打印P3foo而不仅仅是foo.如果我改变代码就好
std::cout << typeid(*this).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)
它打印3foo.
有什么想法吗?
Joh*_*itb 31
因为它是指向foo的指针.foo有3个字符.所以它变成了P3foo
.另一个有类型foo
,所以它变成了3foo
.请注意,文本是依赖于实现的,在这种情况下,GCC只会为您提供内部的错位名称.
在程序中输入该受损名称c++filt
以获取未编号的名称:
$ c++filt -t P3foo
foo*
Run Code Online (Sandbox Code Playgroud)
Ili*_* K. 17
std::type_info::name()
返回特定于实现的名称.AFAIK,虽然GCC 有一个,但没有可移植的方式获得"好"的名字.看看abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
Run Code Online (Sandbox Code Playgroud)