How to unmangle mangled names of C++ lambdas?

后端 未结 4 1340
你的背包
你的背包 2021-01-01 17:13

After compilation with g++-4.9.3 -std=c++11 the code

#include 
#include 
using namespace std;
int main() { cout          


        
相关标签:
4条回答
  • 2021-01-01 17:50

    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.

    0 讨论(0)
  • 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;
    }
    
    0 讨论(0)
  • 2021-01-01 18:03

    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.

    0 讨论(0)
  • 2021-01-01 18:10

    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.

    0 讨论(0)
提交回复
热议问题