STM32H562中FILEX与USBX的VOID/void定义冲突问题求助
STM32H562中FileX与USBX的VOID定义冲突解决方案
从STM32F4xx迁移至STM32H562后,使用FileX和USBX替代原有FATFS与USB中间件时,会遇到二者的VOID类型定义冲突:
- FileX通过
#define VOID void定义VOID - USBX通过
typedef void VOID;定义VOID
这会导致编译器报错,具体错误信息如下:
In file included from ../Middlewares/ST/filex/common/inc/fx_api.h:118, from ../FileX/App/app_filex.h:30, from ../Core/Src/main.c:21: ../Middlewares/ST/filex/ports/generic/inc/fx_port.h:90:49: error: two or more data types in declaration specifiers 90 | #define VOID void | ^~~~ ../Middlewares/ST/usbx/ports/generic/inc/ux_port.h:83:49: note: in expansion of macro 'VOID' 83 | typedef void VOID; | ^~~~ In file included from ../Middlewares/ST/usbx/common/core/inc/ux_api.h:149, from ../USBX/App/app_usbx_device.h:29, from ../Core/Src/main.c:22: ../Middlewares/ST/usbx/ports/generic/inc/ux_port.h:83:1: warning: useless type name in empty declaration 83 | typedef void VOID; | ^~~~~~~
可行解决方案
方法1:统一修改为#define定义
找到USBX的ux_port.h文件(路径:../Middlewares/ST/usbx/ports/generic/inc/ux_port.h),将第83行的typedef void VOID;替换为:
#define VOID void
与FileX的定义保持一致,消除冲突。
方法2:统一修改为typedef定义
找到FileX的fx_port.h文件(路径:../Middlewares/ST/filex/ports/generic/inc/fx_port.h),将第90行的#define VOID void替换为:
typedef void VOID;
统一使用typedef方式定义VOID类型。
方法3:通过头文件包含顺序控制
若不想修改中间件源码,可在main.c中调整头文件包含顺序并加入宏取消定义:
// 先包含USBX头文件,此时VOID为typedef定义 #include "app_usbx_device.h" // 取消VOID的typedef定义,再包含FileX头文件 #undef VOID #include "app_filex.h"
也可以反过来先包含FileX,再#undef VOID后包含USBX,需根据代码中VOID的实际使用场景选择顺序。
方法4:全局宏定义覆盖
在项目编译选项中添加全局宏定义(以STM32CubeIDE为例:Project Settings -> C/C++ Build -> Settings -> GCC Compiler -> Preprocessor):
#define VOID void
该全局宏会优先于中间件中的定义,直接覆盖二者的冲突声明。
内容的提问来源于stack exchange,提问作者JavaLatte
相关产品推荐
相关产品推荐

