gpt4 book ai didi

c++ - 任何从 c++filt demangled 输出中获取更多信息的方式

转载 作者:行者123 更新时间:2023-12-02 10:19:40 25 4
gpt4 key购买 nike

我刚刚跑了c++filt当我有一个重复的符号错误时进行解码:

$ c++filt __ZN4uiuclsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_5StackE

uiuc::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, uiuc::Stack const&)

但实际功能看起来像这样 [在 uiuc 内命名空间]:
std::ostream & operator<<(std::ostream & os, const Stack & stack)

我怎样才能得到解耦的输出到
  • 显示返回类型:std::ostream &
  • 显示 std::ostream代替std::__1::basic_ostream<char, std::__1::char_traits<char> >& .有__std:: 之后我没有得到和类似模板的输入。 ostream 是作为模板实现的吗?

  • 我问是因为我无法轻松映射其他返回转弯类型。我正在处理一个用于练习的小文件。

    我正在运行 macOS并尝试了不同的 c++filt --format编译器的选项,但没有看到任何给我不同输出的选项。

    最佳答案

    1. show the return type: std::ostream &


    普通函数的返回类型不是它们的签名或它们的名字的一部分。无法从损坏的名称中获取返回类型。为此,您需要查找声明该函数的头文件。

    但是,对于函数模板,这是不同的。

    1. show std::ostream instead of std::__1::basic_ostream<char, std::__1::char_traits<char> >&. There is the __ right after std:: that I don't get and the template-like input. Is ostream implemented as a template?


    该标准定义 std::ostreamstd::basic_ostream<char, std::char_traits<char>> 的类型别名,它是类模板 std::basic_ostream 的模板特化.对于流可以使用的每种字符类型,都有其特化,例如 std::basic_ostream<wchar_t, std::char_traits<wchar_t>> (别名为 std::wostream )用于宽字符流。

    类型别名在编译期间被解析为它们所引用的实际类型名称,因此经过修改的名称不包含有关在声明中使用的别名的任何信息。区分也是没有意义的,因为无论使用什么别名,功能都应该相同,因此符号名称不能在其上有所不同。

    原则上,您可以为标准库的公共(public)别名运行搜索和替换。我不知道有什么工具可以做到这一点。无论如何,您很快就会习惯非别名。
    ::__1是标准库使用的内联命名空间,能够透明地定义标准库符号的多个版本。可以查找内联命名空间中的名称,就好像它们是在封闭的命名空间中声明的一样,所以当你使用例如 std::ostream ,库实际上可以声明 ostream不在 std命名空间,但在 std::__1 , 如果 __1 仍然可以找到是一个内联命名空间。

    这是一个你应该忽略的实现细节。名称中的双下划线很好地表明它是您不需要关心的实现细节,因为带有双下划线的标识符被保留供语言实现使用。

    同样,您可能可以从标准库 namespace 中搜索和替换此类内联 namespace ,但我不知道是否有任何工具这样做,并且很快就会习惯它。

    关于c++ - 任何从 c++filt demangled 输出中获取更多信息的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60771609/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com