After compilation with g++-4.9.3 -std=c++11
the code
#include <iostream>
#include <typeinfo>
using namespace std;
int main() { cout << typeid([]{}).name() << endl; }
outputs Z4mainEUlvE_
as the mangled name of the given lambda on Linux x86_64. However, the c++filt
tool is unable to unmangle it. It just outputs the input given to it, Z4mainEUlvE_
.
How do I unmangle it?
You can use GCC's special abi::__cxa_demangle
function:
#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';
}
Output:
main::{lambda()#1}
According to The Documentation this function returns a c-style zero-terminated string allocated using std::malloc which the caller needs to free using std::free . This example uses a smart pointer to free the returned string automatically at the end of the scope.
Using c++filt
version 070207 20070207
:
$ c++filt -n Z4mainEUlvE_
main::'lambda'()
Although as the commenters have suggested, these names aren't always entirely helpful.
If you don't need it inside your code, and its only for fun then use an online tool like http://d.fuqu.jp/c++filtjs/ which for Z4mainEUlvE_
it returns main::{lambda()#1}
.
Other tools can be found under this Stack Overflow question .
You could try using boost::core::demangle
but I don't know if your results will be any different.
For example
#include <boost/core/demangle.hpp>
#include <iostream>
int main () {
std::cout << boost::core::demangle (typeid ([](){}).name ()) << std::endl;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.