“C ++ filt”如何找到实际的类型名称?

时间:2015-11-27 15:11:45

标签: c++

对不起,如果这很傻,但我很困惑。

我做了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一起使用?

2 个答案:

答案 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