Сопоставление значений перечисления со строками в C ++

Есть ли способ во время выполнения сопоставить значение перечисления с именем? (Я строю с GCC.)

Я знаю, что GDB может это сделать, и я готов использовать что-то непереносимое и мешающее с отладочными данными.


Изменить: Я ищу решение, которое не требует изменения исходного объявления перечисления или ручного копирования всех значений в функции сопоставления. Я уже знаю, как это сделать.

Эффективно; Мне нужна функция, которая делает то же, что делает GDB, когда форматирует значения enum во время выполнения.


person BCS    schedule 10.12.2009    source источник
comment
Попробуйте начать здесь stackoverflow.com/questions/207976/ и здесь stackoverflow.com/questions/201593/   -  person Igor Oks    schedule 11.12.2009
comment
Интересно игнорировать стоп-слова и суффиксы, все, кроме одного слова в заголовке, совпадают с этой первой ссылкой, и она ВСЕ ЕЩЕ не отображалась в автоматическом поиске ....   -  person BCS    schedule 11.12.2009
comment
Игорь Окс: упомянутые вопросы / ответы, похоже, вращаются либо вокруг альтернативных стилей замедления enum, либо вручную сгенерированных функций. У меня уже есть решение, которое работает через такое решение.   -  person BCS    schedule 11.12.2009
comment
@BCS: Вы хотите, чтобы информация написала что-то подобное или что-то уже написанное (как подсказывает ваш комментарий к ответу Goz)?   -  person David Thornley    schedule 11.12.2009
comment
Я ищу библиотеку, которой можно просто пользоваться.   -  person BCS    schedule 11.12.2009
comment
Это немного проблематично, потому что компиляторы добавляют информацию в свои отладочные версии исполняемых файлов. Вы можете написать код для извлечения этой информации из исполняемого файла, но мне гораздо проще просто вставить код преобразования в мою программу. Не думаю, что это займет много времени.   -  person Thomas Matthews    schedule 11.12.2009
comment
Томас Мэтьюз: Лично я полагаю, что ручное решение быстрее. Но правильно сделанное решение (вроде таких: gnu.org/ s / libc / manual / html_node / Backtraces.html) будет быстрее и проще для всех (для сообщества в целом).   -  person BCS    schedule 11.12.2009


Ответы (3)


Если вы не хотите тратить время на использование информации о символах GCC, gcc-xml предоставит вам информацию о Исходники C ++ в формате XML многократного использования, включая имена перечислений.

Упрощенный пример ... этот источник:

enum E {
  e1 = 1,
  e2 = 42
};

становится:

<GCC_XML>
  <!-- ... -->
  <Enumeration name="E">
    <EnumValue name="e1" init="1"/>
    <EnumValue name="e2" init="42"/>
  </Enumeration>
  <!-- ... -->
</GCC_XML>
person Georg Fritzsche    schedule 11.12.2009
comment
Это плюс немного удовольствия от XSLT, и я смогу создать код нужной мне функции. Фу. - person BCS; 29.03.2011

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

Может быть, это можно сделать с помощью Perl-скрипта?

person Thomas Matthews    schedule 10.12.2009
comment
В предыдущем задании у нас была довольно тщательная система для определения всех кодов возврата в перечислениях и сценарий Perl для их извлечения и создания компилируемого файла строк, чтобы их можно было распечатать при возникновении ошибки. В наши дни я, вероятно, использовал бы Python, но Perl справился со своей задачей. - person Steve Fallows; 11.12.2009

Это может быть вам полезно:

Формат отладки "stabs"

person Goz    schedule 10.12.2009
comment
Это было бы полезно для парня, который пишет библиотеку, которую я ищу. - person BCS; 11.12.2009
comment
Когда вы предоставляете ссылку, дайте краткое содержание (по крайней мере) одним предложением того, на что она ссылается. - person ; 11.12.2009