我正在开发调试/内存工具。我想显示来自 C++ 的符号,问题是它们非常冗长。目前我只使用 __cxa_demangle ,但由于包含默认模板参数,这通常会导致超过 500 个字符的巨大字符串。
clang++ 在报告符号时显然可以做一些聪明的事情,有什么方法可以利用它吗?

作为一个简单的例子,让我们来看:

std::map<std::string const, unsigned int, std::less<std::string const>, std::allocator<std::pair<std::string const, unsigned int> > >::find(std::string const&)

这显然可以报告为:
std::map<std::string const, unsigned int>::find(std::string const&)

.. 如果我有一个足够聪明的工具。很明显,如果没有额外的知识(比如最初使用的包含 - 我可能会得到这些),这通常很难做到,但我会很感激任何指点。

到目前为止,我一直在使用 libcxxabi ,但除了没有到解析树的公共(public)接口(interface)(这本身不会阻止我)之外,似乎我必须努力确定哪些参数是默认值.如果我能以某种方式欺骗 clang 为我做这件事,那就太好了。

最佳答案

STLFilt 可以帮助你。有两个 perl 脚本,STLFilt.pl(用于 Visual C++)和 gSTLFilt.p(用于 gcc)。它旨在用于简化错误消息,但我已经将其用于后处理 __cxa_demangle 的输出。

在没有任何选项的简单示例中使用:

echo "std::map<std::string const, unsigned int, std::less<std::string const>, std::allocator<std::pair<std::string const, unsigned int> > >::find(std::string const&)" \
| perl ./gSTLFilt.pl

获取输出:
BD Software STL Message Decryptor v3.10 for gcc 2/3/4
map<string const, unsigned int>::find(string const &)

如果您想使用它的选项,您应该能够获得定制的重新格式化(我还没有尝试过)。

关于c++ - 简化复杂的 C++ 模板符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12227640/

10-11 22:54
查看更多