2011-01-25 2 views
2

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

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

Но для автоматизации вещей я хотел бы создать кучу макросов, чтобы имитировать перегрузку функций, поэтому мне не нужно иметь индивидуальные функции getInt, , 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##; 

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

+0

Определение «не работает правильно». –

+0

Это не компиляция. –

+0

Кстати, в C, в чем преимущество геттеров и сеттеров? –

ответ

5

Проблема заключается в запятой в конце каждого 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) 
0

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

1

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

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

DM(var1, int),   \ 
    DM(var2, long),  \ 
    DM(var3, double),  \ 
    DM(var4, int) 
0

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

#define DATA_LIST  \ 
    DM(var1, int),   \ 
    DM(var2, long),  \ 
    DM(var3, double),  \ 
    DM(var4, int) 
Смежные вопросы