Любой способ получить больше информации из разделенного вывода C ++ Filter - PullRequest
1 голос
/ 20 марта 2020

Я только что запустил 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)

Как получить дешифрованный вывод в

  1. , показать тип возврата: std::ostream &
  2. показать std::ostream вместо std::__1::basic_ostream<char, std::__1::char_traits<char> >&. Сразу после std:: есть __, который я не получаю, и шаблонный ввод. Реализован ли ostream как шаблон?

Я спрашиваю, потому что есть другие типы обратных ходов, которые я не смогу легко отобразить. Я имею дело с небольшим файлом для практики.

Я работаю на macOS и пробовал разные опции c++filt --format для компилятора, но не увидел ни одного, который дал бы мне другой вывод.

1 Ответ

1 голос
/ 20 марта 2020
  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>>, который является специализацией шаблона шаблона std::basic_ostream. Есть специализации этого для каждого символьного типа, который поток может использовать, например, std::basic_ostream<wchar_t, std::char_traits<wchar_t>> (псевдоним std::wostream) для широких символьных потоков.

Псевдонимы типов разрешаются во время компиляции к фактическому имени типа, к которому они относятся to, поэтому искаженное имя не содержит никакой информации о псевдониме, который использовался в объявлении. Также было бы бессмысленно проводить различие, поскольку функция должна быть одинаковой, независимо от того, какой псевдоним использовался, поэтому имя символа не может отличаться от него.

В принципе, вы можете запустить поиск и -замена для стандартных псевдонимов стандартной библиотеки. Я не знаю ни одного инструмента, который делает это на макушке. В любом случае вы быстро привыкните к псевдонимам.

::__1 - это встроенное пространство имен, используемое стандартной библиотекой, чтобы иметь возможность прозрачно определять несколько версий символов стандартной библиотеки. Имена во встроенном пространстве имен можно искать так, как если бы они были объявлены во вложенном пространстве имен, поэтому при использовании, например, std::ostream, библиотека может фактически объявить ostream не в пространстве имен std, а в std::__1, который все равно будет найден, если __1 является встроенным пространством имен.

Это деталь реализации, которую вы должны просто проигнорировать. Двойное подчеркивание в имени является хорошим показателем того, что вам не нужно заботиться о деталях реализации, поскольку идентификаторы с двойным подчеркиванием зарезервированы для использования языковой реализацией.

Опять же, вы возможно, можно искать и заменять такие встроенные пространства имен из стандартного пространства имен библиотеки, но я не знаю, делает ли это какой-либо инструмент, и опять же, к нему быстро привыкают.

...