我已经定义了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结构,并自动创建一个分配器功能。
现在,当我使用这些宏时:
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; }
当我尝试编译时,我得到两个错误:
我看不出这些错误的原因。如果你帮我找到它,我将不胜感激。感谢。
答案 0 :(得分:5)
您需要使用struct作为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; }
这是因为在声明dealloc
。
此外,在C ++中,您的struct name和typedef不得相互冲突。所以我通过_##TYPE
在结构名称中加了一个下划线。