MSVC enum отладка - PullRequest
       20

MSVC enum отладка

2 голосов
/ 29 апреля 2010

Есть ли быстрый способ вывода имен перечисляемых значений? Я полагаю, вы знаете, что я имею в виду, и вообще это невозможно, поскольку, конечно, все эти данные становятся неактуальными в процессе компиляции, но я использую MSVC в режиме отладки, так возможно ли это?

Ответы [ 4 ]

1 голос
/ 29 апреля 2010

Это распространенная проблема C ++, которая решается с помощью "Typesafe enum pattern". Обычно это делается с помощью сумасшедших определений прекомпиляторов или генераторов кода. Быстрый поиск "Typesafe enum pattern C ++" может дать вам следующие способы. Лично у меня есть собственный генератор кода для перечислений C ++, который выполняется как шаг пользовательской сборки MSVC для h-файлов с перечислениями.

1 голос
/ 29 апреля 2010

Я просто поместил имена перечислений в таблицу поиска (или вы могли бы использовать map<>) со значением перечисления в качестве ключа, и у меня есть функция, выполняющая поиск.

Это низкотехнологичное, но обычно это не слишком большая боль.

В некоторых проектах у меня было бы странное расположение заголовка / макроса, которое могло бы создать определение перечисления, используя один элемент, похожий на объявление, для каждого имени перечисления. Мое мнение о том, как работает эта техника, колеблется между «удобным» или «грязным».

1 голос
/ 29 апреля 2010

Метамакросы вызывают всевозможные разрушения в Intellisense и т.п., но они могут облегчить эту задачу ...

#define MY_ENUMS(e_) \
   e_(Enum_A), \
   e_(Enum_B), \
   e_(Enum_C), \

#define ENUM_EXPANDER(e_)  e
enum MyEnums
{
   MY_ENUMS(ENUM_EXPANDER)
   CountOfMyEnums
};

#define STRING_EXPANDER(e_)  #e_
const char* g_myEnumStrings[] =
{
   MY_ENUMS(STRING_EXPANDER)
};

Возможно даже

#define CASE_EXPANDER(e_)  case e_: return #e_;
const char* GetEnumName(MyEnums e)
{
   switch (e)
   {
      MY_ENUMS(CASE_EXPANDER)

   default:
      return "Invalid enum value";
   }
}

Различные «макросы расширения» могут использоваться для заполнения карт или других структур данных по вашему выбору. Я использовал этот вид ужаса для разбора перечислений из файлов конфигурации (так что автор, который создает файл конфигурации, может использовать перечисление, а не индекс).

0 голосов
/ 29 апреля 2010

К сожалению нет. Все имена перечислений теряются компилятором. Они есть в файле PDB, поэтому отладчик может сработать, но в противном случае единственный способ сделать это - написать функцию, которая выполняет переключение и возвращает строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...