Как проверить, определен ли элемент enum для условной компиляции? - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над STM8 MCU и, в отличие от STM32, константы MCU определены как enum, а не как # define.

На самом деле мне нужно знать, существует ли значение enum для условной компиляции. Для константы #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 все режимы определены как enum:

// 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 не работает в этом случае. Как я могу проверить, определены ли константы enum, и сделать мой код переносимым на другие микроконтроллеры STM8?

1 Ответ

0 голосов
/ 29 апреля 2020

Это невозможно, поскольку препроцессор ничего не знает о языке C и перечислениях. Фактическая компиляция происходит после этапа предварительной обработки.

Вы не можете использовать любые C типы, функции или переменные в препроцессоре #if s

...