Любой способ получить дополнительную информацию из вывода C++filter с разоблачением
Я просто сбежал 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 ответ
- показать тип возврата:
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>>
, который является специализацией шаблона класса template std::basic_ostream
. Для каждого типа символов, который может использовать поток, есть специализации, напримерstd::basic_ostream<wchar_t, std::char_traits<wchar_t>>
(под псевдонимом std::wostream
) для широких символьных потоков.
Псевдонимы типа разрешаются во время компиляции в фактическое имя типа, на которое они ссылаются, поэтому искаженное имя не содержит никакой информации о псевдониме, который использовался в объявлении. Также не имеет смысла проводить различие, потому что функция должна быть одинаковой, независимо от того, какой псевдоним был использован, поэтому имя символа не может отличаться на нем.
В принципе, вы можете выполнить поиск и замену общих псевдонимов стандартной библиотеки. Я не знаю ни одного инструмента, который бы делал это в моей голове. В любом случае к именам без псевдонимов привыкаешь быстро.
::__1
- это встроенное пространство имен, используемое стандартной библиотекой для возможности прозрачного определения нескольких версий символов стандартной библиотеки. Имена во встроенном пространстве имен можно искать, как если бы они были объявлены во включающем пространстве имен, поэтому, когда вы используете, например,std::ostream
, библиотека может фактически объявить ostream
не в std
пространство имен, но в std::__1
, который все равно будет найден, если __1
является встроенным пространством имен.
Это деталь реализации, которую вы должны просто игнорировать. Двойное подчеркивание в имени является хорошим индикатором того, что это деталь реализации, о которой вам не нужно заботиться, потому что идентификаторы с двойным подчеркиванием зарезервированы для использования реализацией языка.
Опять же, вы, вероятно, могли бы искать и заменять такие встроенные пространства имен из пространства имен стандартной библиотеки, но я не знаю, делает ли это какой-либо инструмент, и снова к этому быстро привыкаешь.