Как определить определение в C? - PullRequest
13 голосов
/ 28 февраля 2011

Можно ли написать #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 работать и определить два определения?

Ответы [ 2 ]

15 голосов
/ 28 февраля 2011

Нет; Предварительная обработка выполняется за один проход. Если вы хотите или нуждаетесь в более сложном поведении, рассмотрите возможность использования другого инструмента для предварительной обработки источника, например m4.

Кроме того, # в списке замены (в начале #define FIDN... будет проанализировано как оператор # (stringize): операндом этого оператора должен быть именованный макрос-параметр, который define нет.

0 голосов
/ 16 июня 2011

Нет, при определении макросов вы должны позаботиться об одном, что макрос не должен вызывать сам (рекурсивно) ни прямо, ни косвенно.

Я знаю, что две статические переменные, занимающие 8 байтов, будут для вас экспансивными.

У меня есть решение по этому поводу

#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)

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

...