在switch case节点中将const int指针转换为int

时间:2017-04-24 11:08:42

标签: c++ gcc arm stm32

在我的STM32代码中,我有一个

#define USART1              ((USART_TypeDef *) USART1_BASE)

我希望

switch((uint32_t)ptr)
{
  case USART1: return 1;
(...)

但gcc-arm(6.3.1)给我一个错误

  

错误:从整数到指针

的reinterpret_cast

我找到了一个可以使用的信息

  case __builtin_constant_p(USART1): return 0;

但这只是gcc解决方案?还有更通用的东西吗?

3 个答案:

答案 0 :(得分:2)

UART1_BASE只是几个无符号整数常量的总和。请参阅机器标题:

#define PERIPH_BASE           0x40000000U
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000U)
#define USART1_BASE           (APB2PERIPH_BASE + 0x1000U)

所以应该可以使用

switch((unsigned int)ptr) {
    case USART1_BASE: return 1;
}

答案 1 :(得分:2)

你也忘了在case语句中将指针转换为整数。 我的工作代码示例:

switch ((uint32_t)gpio) {
    case (uint32_t)GPIOA:
        EXTI_cfgr = 0b0000;
        break;
    case (uint32_t)GPIOB:
        EXTI_cfgr = 0b0001;
        break;
    case (uint32_t)GPIOC:
        EXTI_cfgr = 0b0010;
        break;
    default:
        break;
    }

答案 2 :(得分:0)

USART1_BASE是STM32开发环境的头文件中的数字。当您决定在交换机中使用何种类型时,您可以编译代码。我推荐uint32_t

switch((uint32_t)ptr)
{
  case USART1_BASE: return 1;
  (...)

如果您想要更多可读性,可以尝试从开关中删除演员:

uint32_t ptr_value = (uint32_t)ptr;

switch(ptr_value)
{
  case USART1_BASE: return 1;
  (...)
相关问题