我正在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语言和枚举一无所知。实际的编译在预处理阶段之后进行。
您不能在预处理程序#if中使用任何C类型,特征或变量