C++中#if与#elif指令未按预期工作的原因排查
问题原因与解决办法
你遇到的问题核心是ESP32_S3_MINI_1和ESP32_S3_WROOM这两个宏没有被定义,C预处理器会把未定义的宏默认当作0处理。
比如你在Parameters.h里写#define MCU_IN_USE ESP32_S3_WROOM,但如果ESP32_S3_WROOM没被定义,预处理器会把它替换成0,此时MCU_IN_USE == ESP32_S3_MINI_1就变成了0 == 0,条件成立,所以总是走第一个分支。
解决步骤
- 第一步,在Parameters.h里先给这两个MCU标识定义唯一的数值:
// 先定义各MCU的标识值 #define ESP32_S3_MINI_1 1 #define ESP32_S3_WROOM 2 // 再选择要使用的MCU //#define MCU_IN_USE ESP32_S3_MINI_1 #define MCU_IN_USE ESP32_S3_WROOM - 这样预处理器就能正确识别两个宏的不同值,
#if和#elif的判断就会正常工作。
另一种更简洁的写法是直接给MCU_IN_USE赋值唯一标识,比如:
// 在Parameters.h里 //#define MCU_IN_USE 1 #define MCU_IN_USE 2 // 然后在主文件里判断 #if MCU_IN_USE == 1 #include "ESP32_S3_MINI_1_PINOUT.h" #elif MCU_IN_USE == 2 #include "ESP32_S3_WROOM_PINOUT.h" #endif
这种写法跳过了中间宏的定义,直接用数值判断,逻辑更直观。
内容的提问来源于stack exchange,提问作者Dominykas
相关产品推荐
相关产品推荐

