Как определить определение в C?
Можно ли написать #define
, который определяет #define
?
Например:
#define FID_STRS(x) #x
#define FID_STRE(x) FID_STRS(x)
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v)
Вместо этого:
#define FID_DECL2(n, v) #define FIDN_##n v \
FIDS_##n FID_STRE(v)
FID_DECL
работает отлично, но создает две статические переменные. Можно ли сделать работу FID_DECL2
и определить два определения?
Ответы
Ответ 1
Нет; предварительная обработка выполняется за один проход. Если вам нужно или требуется более продвинутое поведение, подумайте об использовании другого инструмента для предварительной обработки источника, например, m4.
Кроме того, #
в списке заметок (в начале #define FIDN...
будет анализироваться как оператор #
(stringize): операнд этого оператора должен быть именованным параметром макроса, который define
нет.
Ответ 2
Нет, при определении макросов u следует позаботиться об одной вещи
что макрос не должен называть себя (рекурсивным) либо напрямую
или косвенно.
Я знаю, что две статические переменные, потребляющие 8 байтов, будут экспансивными для u.
У меня есть решение над ним
#define FID_STRS2(x) #x
#define FID_STRE(x) FID_STRS2(x)
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v)
Просто переименуйте их в рекурсивный