C макрос конкатенации для создания структуры - PullRequest
2 голосов
/ 25 января 2011

Я пытаюсь создать макрос для автоматизации создания методов доступа для различных типов переменных в простой «базе данных» на C. Это делается через структуру:

typedef struct {
    int var1;
    long var2;
    double var3;
    int var4;
} dataNames_t;

Но для автоматизации вещей я хотел бы создать несколько макросов, имитирующих перегрузку функций, чтобы мне не приходилось иметь отдельные функции getInt, getBool, getLong и т. Д. Мы делаем это довольно часто, поэтому мы можем очень быстро добавлять записи в длинные списки очень похожих вещей. Таким образом, нам не нужно изменять 5 мест в файле, чтобы добавить запись. Тем не менее, я не могу понять это для структуры.

#define DATA_LIST        \
  DM(var1, int),         \
  DM(var2, long),        \
  DM(var3, double),      \
  DM(var4, int)

#define DM(y, z)    z y;

/* create data structure from the macro */
typedef struct {
    DATA_LIST
} dataNames_t;

Эта структура должна соответствовать первой, но что-то работает неправильно.

#define DM(y, z)    z y##;

тоже не работает.

Ответы [ 4 ]

5 голосов
/ 25 января 2011

Проблема заключается в запятой в конце каждого DM(...) в вашем DATA_LIST; ваша структура эффективно расширяется до:

typedef struct {
    int var1;,
    long var2;,
    double var3;,
    int var4;
} dataNames_t;

Измените DATA_LIST на:

#define DATA_LIST       \
  DM(var1, int)         \
  DM(var2, long)        \
  DM(var3, double)      \
  DM(var4, int)
1 голос
/ 25 января 2011

Используйте флаг -E в gcc, если вы хотите увидеть выходные данные препроцессора. Это может быть очень полезно при отладке макросов.

Однако в этом случае проблема заключается в запятых в каждой строке:

  DM(var1, int),         \
  DM(var2, long),        \
  DM(var3, double),      \
  DM(var4, int)
0 голосов
/ 25 января 2011

Удалить запятые из DATA_LIST:

#define DATA_LIST        \
  DM(var1, int),         \
  DM(var2, long),        \
  DM(var3, double),      \
  DM(var4, int)
0 голосов
/ 25 января 2011

Я подозреваю, что проблема в запятой после каждого DM() в вашем макросе DATA_LIST.

...