如何解除C ++ lambdas的错误名称?

时间:2016-04-10 19:24:26

标签: c++ c++11 lambda name-mangling

使用g++-4.9.3 -std=c++11代码编译后

#include <iostream>
#include <typeinfo>
using namespace std;
int main() { cout << typeid([]{}).name() << endl; }

在Linux x86_64上输出Z4mainEUlvE_作为给定lambda的受损名称。但是,c++filt工具无法解开它。它只输出给定的输入Z4mainEUlvE_

我如何解开它?

4 个答案:

答案 0 :(得分:16)

您可以使用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,此函数返回使用std::malloc分配的c样式零终止字符串,调用者需要使用std::free释放该字符串。此示例使用智能指针在范围的末尾自动释放返回的字符串。

答案 1 :(得分:7)

使用ritcountry_ary = right_country.split(", "); 版本c++filt

070207 20070207

虽然评论者提出这些名称并不总是完全有用。

答案 2 :(得分:2)

如果您在代码中不需要它,并且只是为了好玩,那么请使用http://d.fuqu.jp/c++filtjs/之类的在线工具,Z4mainEUlvE_它会返回main::{lambda()#1}

其他工具可在this Stack Overflow question下找到。

答案 3 :(得分:1)

您可以尝试使用boost::core::demangle,但我不知道您的结果是否会有所不同。

例如

#include <boost/core/demangle.hpp>
#include <iostream>

int main () {
  std::cout  << boost::core::demangle (typeid ([](){}).name ()) << std::endl;
}