C语言 如何使用宏定义结构

yqkkidmi  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(95)

最近我一直在做stm32,处理一些msg问题。我试图构造一个队列来存储来自usart和can的消息,然后我想到我应该为它们构建一个泛型类型。我尝试使用一个宏来定义不同类型的队列,但错误产生。
下面是我的代码,我希望使用“USART_QUEUE2”作为类型:

#define DEF_QUEUE(ITEM_TYPE,NAME) \
typedef struct #NAME \
{\
    (ITEM_TYPE)* buffer;    \
    void (*Push)((ITEM_TYPE)* src, struct #NAME * queue);\
}#NAME;\

DEF_QUEUE(u8,USART_QUEUE2)

这里的错误是"message": "expected either a definition or a tag name" "message": "expected identifier or '(' before string constant"
我不知道该怎么补救。有人能帮我拿一下这个吗?
我试着问ChatGPT,但显然它不能正确处理宏问题。我已经把相关的问题卷进去了,但没有找到精确的解决方案。

a8jjtwal

a8jjtwal1#

1.你不能在宏值周围使用通常的(),所以这是额外的脆弱。
1.不要在这里使用'#',因为这将创建字符串,但您需要标识符。
1.(不固定)我不喜欢在类型旁边有'*'而不是变量的风格,因为它不能泛化(int* a, b不是int *a, *b)。

#define DEF_QUEUE(ITEM_TYPE,NAME) \
typedef struct NAME \
{ \
    ITEM_TYPE* buffer; \
    void (*Push)(ITEM_TYPE* src, struct NAME* queue); \
} NAME

DEF_QUEUE(u8,USART_QUEUE2);

下面是相应的输出:

typedef struct USART_QUEUE2 { u8* buffer; void (*Push)(u8 *src, struct USART_QUEUE2 *queue); } USART_QUEUE2;

相关问题