gcc中是否有与__cxa_demangle等效的Microsoft VC ++?

Ala*_*ang 5 reflection name-mangling visual-c++

我已经尝试过UnDecorateSymbolName()。

例如:

    #include <windows.h> 
    #include <tchar.h>
    #include <iostream>
    #pragma comment(lib,"dbghelp.lib")     

    int main(int argc, _TCHAR* argv[])  
    {  
      TCHAR szUndecorateName[256];  
      memset(szUndecorateName,0,256);  
      if (2==argc)  
      {  
        ::UnDecorateSymbolName(argv[1],szUndecorateName,256,0);  
        std::cout<<szUndecorateName<<std::endl;  
      }  
      return 0;  
    }
Run Code Online (Sandbox Code Playgroud)

我修改了例子。它可以很好地工作。

Cla*_*anu 1

我发现通常 __cxa_demangle 与参数 typeid(v).name() 一起使用来获取变量 v 的类型。可能最初的问题是在这个意义上(或类似),因为它是由作者评论建议的,但现在什么时候是转换为包含答案(并从 argv 获取符号f),它偏离了该用法。

对于正在寻找一种使用 C++ 中的 __cxa_demangle 替换来打印变量类型的解决方案的人,使用 MSVS 2019、Windows 10,我建议使用以下代码:

#if defined ( _MSC_VER )
#include <windows.h> 
#include <dbghelp.h>
#pragma comment(lib,"dbghelp.lib")     
#else
#include <cxxabi.h>
#endif
#include <iostream>
#include <stdlib.h>
#include <string>

template <typename T> std::string nameofType(const T& v)
{
#if defined( _MSC_VER )
    //try to allocate a buffer as __cxa_demangle will do
    //assuming symbol name is less than 1024 bytes
    char* realname = (char*)malloc(1024 * sizeof(char));
    //if alloc was OK then set 0 first char and use UnDecorateSymbolName
    realname ? realname[0] = 0, ::UnDecorateSymbolName(typeid(v).name(), realname, 1024, 0) : 0;
#else
    int     status;
    //__cxa_demangle will allocate the buffer for the answer
    char* realname = abi::__cxa_demangle(typeid(v).name(), 0, 0, &status);
#endif
    //if null returned or 0 was not changed in something else then demangle not successful
    std::string name(realname && realname[0] ? realname : "????");
    free(realname);

    return name;
}

int main()
{
    int a_int;
    double a_double;
    
    std::cout << "nameofType a_int is:" << nameofType(a_int) << "\n" <<
        "nameofType a_double is:" << nameofType(a_double) << "\n";
    
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

它打印:

nameofType a_int is:int
nameofType a_double is:double
Run Code Online (Sandbox Code Playgroud)

PS谢谢你@sehe!受到他对问题 9404189的回答的启发。