2012-06-18 5 views
2

В Win32 существует множество мест, где значения флагов задаются с помощью значений DWORD, которые создаются путем выполнения побитового ИЛИ #defined констант.Преобразование флагов integer в текст, читаемый человеком

Однако, когда дело доходит до запуска программы и ее отладки, может возникнуть боль, чтобы разделить генерируемые значения флага обратно на их #define символы (вот почему мне нравятся типы перечислений).

Недостаточно переопределять функции и структуры Win32 для использования перечислений вместо констант, есть ли простой и безболезненный способ автоматического преобразования значений целочисленных флагов обратно в строковое представление их компонентов? Например, преобразование 192 в «FLAG_FOO | FLAG_BAR» (где FLAG_FOO равно 128, а FLAG_BAR - 64).

+0

Некоторые из них могут уже иметь связанные строки, например коды ошибок. – chris

ответ

0

Вы должны закодировать строки вручную.

if (myValue & FLAG_FOO == FLAG_FOO) { 
    printf("FLAG_FOO"); 
} 
if (myValue & FLAG_BAR == FLAG_BAR) { 
    printf("FLAB_BAR"); 
} 

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

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

+3

-1 неправильные выражения. это проблема приоритета оператора. взгляните на http://en.cppreference.com/w/cpp/language/operator_precedence –

+0

-1 по той же причине. Код не работает. –

Смежные вопросы