如何检查是否为条件编译定义了枚举项?

问题描述 投票:0回答:1

我正在STM8 MCU上工作,与STM32不同,MCU的常量被定义为枚举而不是#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上。

谢谢大家,

问候,

AJT

c enums compilation c-preprocessor microcontroller
1个回答
0
投票

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

您不能在预处理程序#if中使用任何C类型,特征或变量

© www.soinside.com 2019 - 2024. All rights reserved.