如何解开 C++ lambda 的混乱名称?
How to unmangle mangled names of C++ lambdas?
用g++-4.9.3 -std=c++11
代码编译后
#include <iostream>
#include <typeinfo>
using namespace std;
int main() { cout << typeid([]{}).name() << endl; }
输出 Z4mainEUlvE_
作为给定 lambda 在 Linux x86_64 上的错位名称。但是,c++filt
工具无法解开它。它只是输出给它的输入,Z4mainEUlvE_
.
我该如何解开它?
使用 c++filt
版本 070207 20070207
:
$ c++filt -n Z4mainEUlvE_
main::'lambda'()
尽管正如评论者所建议的那样,这些名称并不总是完全有用。
您可以尝试使用 boost::core::demangle
,但我不知道您的结果是否会有所不同。
例如
#include <boost/core/demangle.hpp>
#include <iostream>
int main () {
std::cout << boost::core::demangle (typeid ([](){}).name ()) << std::endl;
}
您可以使用 GCC 的特殊 abi::__cxa_demangle
功能:
#include <memory>
#include <cstdlib>
#include <cxxabi.h>
#include <iostream>
// delete malloc'd memory
struct malloc_deleter
{
void operator()(void* p) const { std::free(p); }
};
// custom smart pointer for c-style strings allocated with std::malloc
using cstring_uptr = std::unique_ptr<char, malloc_deleter>;
int main()
{
// special function to de-mangle names
int error;
cstring_uptr name(abi::__cxa_demangle(typeid([]{}).name(), 0, 0, &error));
if(!error)
std::cout << name.get() << '\n';
else if(error == -1)
std::cerr << "memory allocation failed" << '\n';
else if(error == -2)
std::cerr << "not a valid mangled name" << '\n';
else if(error == -3)
std::cerr << "bad argument" << '\n';
}
输出:
main::{lambda()#1}
根据The Documentation this function returns a c-style zero-terminated string allocated using std::malloc which the caller needs to free using std::free。此示例使用 智能指针 在范围末尾自动释放返回的字符串。
如果您的代码中不需要它,并且它只是为了好玩,那么请使用像 http://d.fuqu.jp/c++filtjs/ 这样的在线工具,对于 Z4mainEUlvE_
它 returns main::{lambda()#1}
.
可以在 this Stack Overflow question 下找到其他工具。
用g++-4.9.3 -std=c++11
代码编译后
#include <iostream>
#include <typeinfo>
using namespace std;
int main() { cout << typeid([]{}).name() << endl; }
输出 Z4mainEUlvE_
作为给定 lambda 在 Linux x86_64 上的错位名称。但是,c++filt
工具无法解开它。它只是输出给它的输入,Z4mainEUlvE_
.
我该如何解开它?
使用 c++filt
版本 070207 20070207
:
$ c++filt -n Z4mainEUlvE_
main::'lambda'()
尽管正如评论者所建议的那样,这些名称并不总是完全有用。
您可以尝试使用 boost::core::demangle
,但我不知道您的结果是否会有所不同。
例如
#include <boost/core/demangle.hpp>
#include <iostream>
int main () {
std::cout << boost::core::demangle (typeid ([](){}).name ()) << std::endl;
}
您可以使用 GCC 的特殊 abi::__cxa_demangle
功能:
#include <memory>
#include <cstdlib>
#include <cxxabi.h>
#include <iostream>
// delete malloc'd memory
struct malloc_deleter
{
void operator()(void* p) const { std::free(p); }
};
// custom smart pointer for c-style strings allocated with std::malloc
using cstring_uptr = std::unique_ptr<char, malloc_deleter>;
int main()
{
// special function to de-mangle names
int error;
cstring_uptr name(abi::__cxa_demangle(typeid([]{}).name(), 0, 0, &error));
if(!error)
std::cout << name.get() << '\n';
else if(error == -1)
std::cerr << "memory allocation failed" << '\n';
else if(error == -2)
std::cerr << "not a valid mangled name" << '\n';
else if(error == -3)
std::cerr << "bad argument" << '\n';
}
输出:
main::{lambda()#1}
根据The Documentation this function returns a c-style zero-terminated string allocated using std::malloc which the caller needs to free using std::free。此示例使用 智能指针 在范围末尾自动释放返回的字符串。
如果您的代码中不需要它,并且它只是为了好玩,那么请使用像 http://d.fuqu.jp/c++filtjs/ 这样的在线工具,对于 Z4mainEUlvE_
它 returns main::{lambda()#1}
.
可以在 this Stack Overflow question 下找到其他工具。