Как определить определение в 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)

Просто переименуйте их в рекурсивный