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)
我修改了例子。它可以很好地工作。
我发现通常 __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的回答的启发。
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |