当我有一个重复的符号错误时,我只运行了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选项,但没有看到任何为我提供不同输出的选项。
发布于 2020-03-20 10:46:53
std::ostream &显示返回类型:
普通函数的返回类型不是它们的签名或损坏的名称的一部分。无法从损坏的名称中获取返回类型。要做到这一点,您需要查找声明函数的头文件。
不过,对于函数模板来说,这是不同的。
std::ostream而不是std::__1::basic_ostream<char, std::__1::char_traits<char> >&。__就在std::之后,我没有得到它,还有类似模板的输入。ostream是否作为模板实现?标准定义std::ostream是std::basic_ostream<char, std::char_traits<char>>的类型别名,它是类模板std::basic_ostream的模板专门化。对于流可以使用的每一种字符类型都有这方面的专门化,例如std::basic_ostream<wchar_t, std::char_traits<wchar_t>> (别名为std::wostream)用于宽字符流。
类型别名在编译过程中被解析为它们所引用的实际类型名称,因此损坏的名称不包含有关声明中使用的别名的任何信息。进行区分也是没有意义的,因为函数应该是相同的,无论使用什么别名,因此符号名在上面不会有任何不同。
原则上,您可以对标准库的常见别名进行搜索和替换。我不知道有什么工具能做到这一点。不管怎么说,你很快就会习惯非化名。
::__1是标准库使用的内联命名空间,可以透明地定义标准库符号的多个版本。可以查找内联命名空间中的名称,就好像它们是在封闭的名称空间中声明的一样,因此当您使用例如std::ostream时,库实际上可能声明ostream不是在std名称空间中,而是在std::__1中,如果__1是内联名称空间,则仍然可以找到它。
这是一个您应该忽略的实现细节。名称中的双下划线是一个很好的指示,表明它是您不需要关心的实现细节,因为带有双下划线的标识符保留给语言实现使用。
同样,您可能可以从标准库命名空间中搜索并替换此类内联命名空间,但我不知道是否有任何工具会这样做,而且人们很快就会习惯它。
https://stackoverflow.com/questions/60771609
复制相似问题