首页 > 解决方案 > 如何检查是否为条件编译定义了枚举项?

问题描述

我正在研究 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 上可移植?

标签: cenumscompilationc-preprocessormicrocontroller

解决方案


这是不可能的,因为预处理器对 C 语言和枚举一无所知。实际编译发生在预处理阶段之后。

您不能在预处理器 #if 中使用任何 C 类型、功能或变量


推荐阅读