demangled 名称的格式有多可靠?

How reliable is the format of demangled names?

我正在处理一个漂亮的 dynamic C++ program which allows the user to define their own data structures which are then serialized in an output HDF5 数据文件。我没有要求用户定义新的 HDF5 数据类型,而是将它们的数据结构“拆分”为 HDF5 子组,在这些子组中存储不同的成员变量数据集。我有兴趣用写入的数据结构类型标记具有子组成员的 HDF5 组,以便数据文件的未来用户将更多地了解如何使用其中包含的数据。

所有这些上下文都让我想到了标题中的问题。 demangle 的名字有多可靠? 问题的症结可以用下面的例子来概括(以 boost demangle 为例,不是必须的)。如果我使用

std::string tn = boost::core::demangle(typeid(MyType).name());

为了在一个具有给定编译器的系统上获得 MyType 的 demangled 名称,如果我在具有可能不同的编译器的不同系统上使用相同的代码,是否会得到相同的结果?我可以安全地做 tn_sys_with_clang == tn_sys_with_gcc 并相信只要 MyType 是同一类型,这个等式就成立吗?

在我看来答案显然是肯定的,我已经在 Compiler Explorer 上检查了许多不同编译器的几个示例;但是,我想确信我没有遗漏任何边缘情况。此外,我不确定编译器之间的 demangling 过程有何不同,以及这可能如何导致引入不同数量的空白。

这里强调的是唯一变化的变量是系统和编译器。我知道更改 MyType 的定义或将其移动到不同的名称空间或包含讨厌的 using 指令或更改我的 demangle 方式可能会更改 demangling 输出的字符串。我想关注一个更有限的问题,其中只有编译器和系统发生变化。

de-mangled 名称的可靠性似乎没有很好的记录。出于这个原因,我将简单地记录我在 x86_64 系统上进行的一些测试,以便比较 gcc 和 clang。这些测试 done through Compiler Explorer 验证相同类型的返回字符串是否相同(包括空格)。

也许如果我开始在我的应用程序中使用它,其中一个用户会发现一个问题,我可以用另一个答案更新这个问题,但就目前而言,我认为信任是安全的(大概) de-mangling.

不可靠。

如果您在 相同的 OS 上使用相同的编译器 编译 ,那么您应该有一定的稳定性 — 但那是绝对保证。名称重整中的 ABI 更改可能会在编译器的发布周期中随时发生。

各个编译器团队可能在他们的文档中有一些关于此的信息。我不打算查找它。对不起。

如果您使用 不同的编译器或不同的操作系统进行编译,则所有赌注均无效。

例如,LLVM/Clang on Windows 附带一个使用 MSVC 作为后端的版本。因此,本机 Windows Clang 端口上的名称重整 与本机 Linux Clang 兼容。

最后,运行 使用您的(当前)编译器进行一些测试总是搬起石头砸自己脚的好方法。正如谚语所说,“仅仅因为它适用于您的编译器,今天……”