Помогите с 2 C макросами - PullRequest
0 голосов
/ 11 июля 2010

Я определил 2 макроса:

#define HCL_CLASS(TYPE) typedef struct TYPE { \
                          HCLUInt rc; \
                          void (*dealloc)(TYPE*);

#define HCL_CLASS_END(TYPE) } TYPE; \
TYPE * TYPE##Alloc() { TYPE *ptr = (TYPE *)malloc(sizeof(TYPE)); if (ptr != NULL) ptr->rc = 1; return ptr; }

Цель этих макросов - создать структуру C с некоторыми предопределенными функциями (retain count и deallocator) и автоматически создать функцию распределителя.

Теперь, когда я использую эти макросы следующим образом:

HCL_CLASS(Dummy)
int whatever;
HCL_CLASS_END(Dummy)

они расширяются в это (взято непосредственно из XCode):

typedef struct Dummy { HCLUInt rc; void (*dealloc)(Dummy*);

int whatever;

} Dummy; Dummy * DummyAlloc() { Dummy *ptr = (Dummy *)malloc(sizeof(Dummy)); if (ptr != ((void *)0)) ptr->rc = 1; return ptr; }

И когда я пытаюсь скомпилироватьпри этом я получаю две ошибки:

  • «Ожидается») перед «*» токеном в строке, которая вызывает HCL_CLASS
  • «Ожидается»;перед 'int' 'в строке, которая объявляет член структуры int

Я не вижу причину этих ошибок.Я был бы благодарен, если бы вы помогли мне найти его.Благодаря.

1 Ответ

5 голосов
/ 11 июля 2010

Вы должны использовать структуру в качестве параметра dealloc, а не typedef:

#define HCL_CLASS(TYPE) typedef struct _##TYPE { \
                          HCLUInt rc; \
                          void (*dealloc)(struct _##TYPE*);  
                       /* use struct here ^^^^^^, not the typedef */

#define HCL_CLASS_END(TYPE) } TYPE; \
TYPE * TYPE##Alloc() { TYPE *ptr = (TYPE *)malloc(sizeof(TYPE));\
                       if (ptr != NULL) ptr->rc = 1; return ptr; }

Это потому, что typedef не завершен, когда вы объявляете dealloc.

Кроме того, в C ++ имя вашей структуры и typedef не должны конфликтовать.Поэтому я добавил подчеркивание к имени структуры через _##TYPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...