STM32中用宏定义通用队列结构体报错求助
修复通用类型队列宏定义的编译错误
你的宏定义编译报错的核心原因是错误使用了宏字符串化操作符#——这个操作符会把宏参数转换成字符串常量,但我们需要的是将NAME作为结构体标签、类型名这类标识符使用,而非字符串,因此触发了编译语法错误。
修复后的代码
#define DEF_QUEUE(ITEM_TYPE, NAME) \ typedef struct NAME \ { \ ITEM_TYPE* buffer; \ void (*Push)(ITEM_TYPE* src, struct NAME* queue); \ } NAME; // 生成USART队列类型 DEF_QUEUE(uint8_t, USART_QUEUE2)
关键修复点
- 移除所有
#NAME写法,直接使用宏参数NAME:宏展开时会直接将NAME替换为指定的标识符(比如USART_QUEUE2),作为结构体标签和最终的类型别名。 - 去掉
(ITEM_TYPE)的多余括号:C语言中声明指针时,直接写ITEM_TYPE* buffer即可,括号属于冗余写法。 - 建议使用标准类型
uint8_t替代u8:u8是非标准typedef,uint8_t是<stdint.h>中定义的标准无符号8位整数类型,兼容性更好(如果你的开发环境已经定义了u8,也可以保留)。
使用示例
你需要先实现具体的入队函数,再定义队列实例:
#include <stdint.h> // 实现USART队列的Push函数 void usart_queue_push(uint8_t* src, USART_QUEUE2* queue) { // 这里编写实际的入队逻辑,比如将src指向的数据写入buffer } // 定义队列缓冲区和实例 uint8_t usart_buffer[64]; USART_QUEUE2 usart_queue = { .buffer = usart_buffer, .Push = usart_queue_push };
内容的提问来源于stack exchange,提问作者fun for fear
相关产品推荐
相关产品推荐

