c - 如何检查是否为条件编译定义了枚举项?
问题描述
我正在研究 STM8 MCU,与 STM32 不同,MCU 的常量被定义为 enum 而不是 #define。
事实是我需要知道条件编译是否存在枚举值。对于#define 常量,这并不难,正如您在我的 STM32 代码中看到的那样:
// code 1
SPCMD_arguments_T const all_mode_a[] =
{
{"GPIO Mode", 0, NULL, NULL, NULL, NULL},
#ifdef GPIO_MODE_INPUT
{ "in", GPIO_MODE_INPUT, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_OUTPUT_PP
{ "opp", GPIO_MODE_OUTPUT_PP, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_OUTPUT_OD
{ "ood", GPIO_MODE_OUTPUT_OD, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_AF_PP
{ "afpp", GPIO_MODE_AF_PP, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_AF_OD
{ "afod", GPIO_MODE_AF_OD, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_ANALOG
{ "an", GPIO_MODE_ANALOG, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_IT_RISING
{ "it_rising", GPIO_MODE_IT_RISING, NULL, NULL, NULL, NULL},
#endif
{ NULL, 0, NULL, NULL, NULL, NULL }
};
但是对于STM8,所有模式都定义为枚举:
// code 2
typedef enum
{
GPIO_Pin_0 = ((uint8_t)0x01), /*!< Pin 0 selected */
GPIO_Pin_1 = ((uint8_t)0x02), /*!< Pin 1 selected */
GPIO_Pin_2 = ((uint8_t)0x04), /*!< Pin 2 selected */
GPIO_Pin_3 = ((uint8_t)0x08), /*!< Pin 3 selected */
GPIO_Pin_4 = ((uint8_t)0x10), /*!< Pin 4 selected */
GPIO_Pin_5 = ((uint8_t)0x20), /*!< Pin 5 selected */
GPIO_Pin_6 = ((uint8_t)0x40), /*!< Pin 6 selected */
GPIO_Pin_7 = ((uint8_t)0x80), /*!< Pin 7 selected */
GPIO_Pin_LNib = ((uint8_t)0x0F), /*!< Low nibble pins selected */
GPIO_Pin_HNib = ((uint8_t)0xF0), /*!< High nibble pins selected */
GPIO_Pin_All = ((uint8_t)0xFF) /*!< All pins selected */
} GPIO_Pin_TypeDef;
所以代码 1 在这种情况下不起作用。如何检查是否定义了枚举常量并使我的代码在其他 STM8 MCU 上可移植?
解决方案
这是不可能的,因为预处理器对 C 语言和枚举一无所知。实际编译发生在预处理阶段之后。
您不能在预处理器 #if 中使用任何 C 类型、功能或变量
推荐阅读
- python - 具有梯度下降的 Python 多项式回归
- python - 从字典中,将字典中的所有值附加到列表中
- laravel - Laravel 5.7 使用 Expo 发送通知
- c# - UWP 组合 - 带圆角的网格 DropShadow
- laravel - Laravel 在表单请求验证后验证其他内容
- reactjs - 状态更改后useEffect不重新渲染
- javascript - 当在另一个组件中声明的组件使用道具时,道具如何工作?
- javascript - 如何拦截推文按钮点击事件?
- java - 如何控制 Jena Turtle 输出?
- python - AWS Lambda - 即使启用了“使用 Lambda 代理集成”,事件对象也是空的