Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Печать значений макросов в читаемом виде

Условный пример, есть группы макросов (таких групп около 20 по проекту + неизвестное количество из винапи):
#define DTR_CONTROL_DISABLE 0x00 #define DTR_CONTROL_ENABLE 0x01 #define DTR_CONTROL_HANDSHAKE 0x02
Может быть существует какой-либо способ при выводе на печать (в лог, в консоль) получить именно имя макроса, чтобы в логе было что-то вроде:
DtrControl: [0х01] DTR_CONTROL_ENABLE
Текущая реализация: функции to_str, внутри у каждой из которых switch блок, вида:
switch (dcb.fDtrControl) { case DTR_CONTROL_DISABLE: tmp = "DTR_CONTROL_DISABLE"; break; case DTR_CONTROL_ENABLE: tmp = "DTR_CONTROL_ENABLE"; break; case DTR_CONTROL_HANDSHAKE: tmp = "DTR_CONTROL_HANDSHAKE"; break; default: tmp = QString("Unknown [%1]").arg(dcb.fDtrControl); }
Буду благодарен за любые советы как можно упростить, сделать понятнее, проще и читабельнее.


Ответ

Си - не мой основной язык, поэтому мой вариант может быть субоптимальным, но можно сделать нечто подобное на макросах:
#include
#define FOO_1 1 #define FOO_2 2
#define STR_(x) #x #define STR(x) STR_(x) #define FOO_STR(x) "[" STR(x) "] " #x
int main(void) { printf("%s
", FOO_STR(FOO_1)); printf("%s
", FOO_STR(FOO_2)); return 0; }
Вывод:
[1] FOO_1 [2] FOO_2

Комментариев нет:

Отправить комментарий