欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gcc程序获取对象类型名

程序员文章站 2022-05-29 11:49:37
...

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_ 

码如下:

相关标签: gcc