以demangled成员函数名返回类型

时间:2017-07-04 22:57:59

标签: c++ abi backtrace demangler

g ++ abi::__cxa_demangle函数不返回成员函数返回值的原因是什么?

以下是此行为的一个有效示例

#include <execinfo.h>
#include <cxxabi.h>
#include <iostream>

struct Foo {
    void operator()() const
    {
        constexpr int buf_size = 100;
        static void *buffer[buf_size];
        int nptrs = backtrace(buffer, buf_size);
        char **strings = backtrace_symbols(buffer, nptrs);
        for(int i = 0; i < nptrs; ++i) {

            auto str = std::string(strings[i]);
            auto first = str.find_last_of('(') + 1;
            auto last = str.find_last_of(')');
            auto mas = str.find_last_of('+');

            int status;
            char* result = abi::__cxa_demangle(str.substr(first, mas-first).c_str(), nullptr, nullptr, &status);
            if (status == 0) std::cout << result << std::endl;
        }
    }
};

int main () {
    Foo f;
    f();
}

和编译后 g++ foo.cpp -std=c++11 -rdynamic 输出是 Foo::operator()() const

有没有办法获得一致的行为,也就是说,获取成员函数的返回值?

1 个答案:

答案 0 :(得分:3)

函数名称的Mangling / demangling超出了C ++标准的范围。纯粹编译器的责任和必要性是以两种不同的函数将具有不同的错位表示(符号)的方式来破坏函数。

同时,标准禁止声明两个仅因其返回类型而不同的函数,因此编译器无需修改返回类型,因为没有任何好处。

你所看到的只是编译器合理懒惰的结果。

此外,这里有一个rextester,其中包含更完整的示例(包括回溯中的全局函数)。