gpt4 book ai didi

c - 帮助2个C宏

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:30 26 4
gpt4 key购买 nike

我定义了 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; }

当我尝试编译它时,出现两个错误:

  • 在调用 HCL_CLASS 的行上“在‘*’标记之前预期为‘)’
  • “预期';'在声明 int 结构成员的行上的“int”之前

我看不出这些错误的原因。如果你能帮我找到它,我将不胜感激。谢谢。

最佳答案

您需要使用结构作为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 的地方 typedef 不完整。

此外,在 C++ 中,结构名称和类型定义不能冲突。因此,我通过 _##TYPE 在结构名称中添加了下划线。

关于c - 帮助2个C宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3224060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com