解组成员函数名称中的返回类型
Posted
技术标签:
【中文标题】解组成员函数名称中的返回类型【英文标题】:Return type in demangled member function name 【发布时间】:2017-07-04 22:57:59 【问题描述】: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】:函数名的修饰/去修饰超出了 C++ 标准的范围。完全是编译器的责任和必要性,以使两个不同的函数将具有不同的重整表示(符号)的方式来处理函数。
同时,由于标准禁止声明两个仅在返回类型上有所不同的函数,因此编译器无需修改返回类型,因为没有任何好处。
您所看到的只是编译器相当懒惰的结果。
另外,这里有一个rextester 的更完整示例(包括回溯中的全局函数)。
【讨论】:
当然可以,但它确实解开了非成员函数名称的返回类型。 @Lezkus 不,它不适合我。刚刚通过添加int bar(const Foo& foo) foo(); return 0;
使用gcc 4.8.4 检查,并从main
调用它-bar
的条目也缺少返回类型。
阿尔吉特。有趣的是,我发现对于普通函数,它不会返回返回类型。另一方面,它适用于模板函数!
我在这里发布了一个后续问题:***.com/questions/44920101/…以上是关于解组成员函数名称中的返回类型的主要内容,如果未能解决你的问题,请参考以下文章