gcc程序获取对象类型名

gcc调试时用typeid(typename).name()查看对象的类型名称,输出的是经过修饰的名字.

如下面的代码,每种类型输出的名字对应每行右边的注释内容.

#include<iostream>

struct stA {
};

using namespace std;
cout<<typeid(int)<<endl; ///< "i"
cout<<typeid(std::string).name()<<endl; // "Ss"
cout<<typeid(stA).name()<<endl; ///< "3stA"
cout<<typeid(const char*).name();<<endl; ///  "PKc"

具体是什么类型,可以通过(1)工具,如c++filt (2)程序方式查看

  • c++filt

$ c++filt i -t
int
$ c++filt Ss -t
std::basic_string<char, std::char_traits<char>, std::allocator<char> >
$ c++filt 3stA -t
stA
$ c++filt PKc -t
char const*
  • 程序方式

代码来自:http://www.cplusplus.com/forum/beginner/175177/

std::string demangle( const char* mangled_name ) {

    std::size_t len = 0 ;
    int status = 0 ;
    std::unique_ptr< char, decltype(&std::free) > ptr(
                __cxxabiv1::__cxa_demangle( mangled_name, nullptr, &len, &status ), &std::free ) ;
    return ptr.get() ;
}

使用:

cout<<demangle(typeid(const char*).name());<<endl;  ///< "char const*"

demangle的非smart_ptr版本代码:

#ifdef __GNUG__ // gnu C++ compiler

#include <cxxabi.h>
#include <stdlib.h>

std::string demangle( const char* mangled_name ) {

    std::string result ;
    std::size_t len = 0 ;
    int status = 0 ;
    char* ptr = __cxxabiv1::__cxa_demangle( mangled_name, nullptr, &len, &status ) ;

    if( status == 0 ) result = ptr ; // hope that this won't throw
    else result = "demangle error" ;

    ::free(ptr) ;
    return result ;
}

#else

std::string demangle( const char* name ) { return name ; }

#endif // _GNUG_ 

码如下:

猜你喜欢

转载自blog.csdn.net/wherwh/article/details/84874681