对不起,如果这很傻,但我很困惑。
我做了Google我的问题,但无法找到任何相关结果。
以下代码编译并写入a.out:
char x;
cout<<typeid(x).name()<<endl;
/a.out
给了我c
我想到的char
。我发现了SO这个问题并得出结论,我们需要使用c++filt -t
对结果进行解算,因此我这样做了:
./a.out | c++filt -t
欢呼!我得到了demangled(这不是字典单词)名称char
。
足够公平!
但困扰我的问题是c++filt
是如何找到的?
我加倍检查管道的作用here。如果我理解正确,它只会将输出c
传递给c++filt -t
。
c++filt
在哪里查找信息?
解码过程如何与c++filt
一起使用?
答案 0 :(得分:4)
c ++ filt在哪里寻找信息?
解码过程如何使用c ++ filt?
修复工作的方式取决于您的平台是什么。因此,解构工作的方式也取决于它。
c++filt
的程序员查看了描述如何在您的平台上破坏符号的规范。或者,他们可能只是调用实现提供的函数,该函数对符号进行解码。
在后一种情况下,实现编译器并因此执行demangling功能的人知道符号是如何被破坏的,因为它们首先实现了修改。
c ++ filt是开源软件,你可以阅读它们的来源,找出它的作用。
如果您对如何自行解码符号感兴趣,我建议您查看编译器手册。
答案 1 :(得分:2)
正如男人写的那样:
c++filt copies each file name in sequence, and writes it on
the standard output after decoding symbols that look like
C++ mangled names.
c++filt handles Solaris Studio C++ legacy versions as well
as the current version.
c++filt reads from the standard input if no input file is
specified.
以下是关于消防的一点介绍:
https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
#include <exception>
#include <iostream>
#include <cxxabi.h>
struct empty { };
template <typename T, int N>
struct bar { };
int main()
{
int status;
char *realname;
// exception classes not in <stdexcept>, thrown by the implementation
// instead of the user
std::bad_exception e;
realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
free(realname);
// typeid
bar<empty,17> u;
const std::type_info &ti = typeid(u);
realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
free(realname);
return 0;
}
打印
St13bad_exception => std::bad_exception : 0
3barI5emptyLi17EE => bar<empty, 17> : 0