为什么?

/home/jan/pstack/dwarf_frame.cc: In member function 'pstack::Elf::Off pstack::Dwarf::CFI::decodeCIEFDEHdr(pstack::Dwarf::DWARFReader&, pstack::Dwarf::FIType, pstack::Elf::Off*) const':
/home/jan/pstack/dwarf_frame.cc:74:10: error: expected unqualified-id before '[' token
     auto [ length, addrLen ] = r.getlength();

检查编译器版本:

$ $CXX --version
arm-poky-linux-gnueabi-g++ (GCC) 5.3.0

结构化绑定是 C++17 的特性,GCC-5 对 C++17 的支持不完整,不支持结构化绑定。需要 GCC-7 以上版本。

怎么办?用 std::tie

考虑到 getlength() 的定义如下:

std::pair<Elf::Off, Elf::Off> DWARFReader::getlength() {
    size_t length = getu32();
    ...
    return { length, 4 };
}

在 C++11 中,可以使用 std::tie 来解包返回的 std::pair,与结构化绑定功能相同:

Elf::Off length, addrLen;
std::tie(length, addrLen) = r.getlength();

在 GCC-5 上编译成功,使用 std::tiestd::pairstd::tuple 中提取值是结构化绑定的简单有效的替代方案

参考: