C++ 在开关案例节点中,将const int指针强制转换为int

C++ 在开关案例节点中,将const int指针强制转换为int,c++,gcc,arm,stm32,C++,Gcc,Arm,Stm32,在我的STM32代码中,我有一个 #define USART1 ((USART_TypeDef *) USART1_BASE) 我想要 switch((uint32_t)ptr) { case USART1: return 1; (...) 但是gcc arm(6.3.1)给了我一个错误 错误:重新解释从整数到指针的\u转换 我找到了一个我可以使用的信息 case __builtin_constant_p(USART1): return 0; 但这是唯一的

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

#define USART1              ((USART_TypeDef *) USART1_BASE)
我想要

switch((uint32_t)ptr)
{
  case USART1: return 1;
(...)
但是gcc arm(6.3.1)给了我一个错误

错误:重新解释从整数到指针的\u转换

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

  case __builtin_constant_p(USART1): return 0;

但这是唯一的gcc解决方案?还有更通用的吗?

USART1\u BASE是STM32开发环境头文件中的一个数字。当您决定在交换机中使用何种类型时,可以编译代码。我建议
uint32\u 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;
  (...)

USART1_BASE是STM32开发环境头文件中的一个数字。当您决定在交换机中使用何种类型时,可以编译代码。我建议
uint32\u 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;
  (...)

有一个
UART1\u 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;
}

有一个
UART1\u 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;
}

您还忘记在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;
    }

您还忘记在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;
    }

什么类型的ptr是
ptr
?什么是
(USART\u TypeDef*)
?switch(reinterpret\u castptr))?您试图将指针强制转换为整数->
switch((uint32\u t)ptr)
@在CortexM3(STM32)等微控制器环境中,您发现所有硬件组件都被描述为结构。
USART\u Typedef
是USART(硬件组件)结构的Typedef
ptr
显然是一个指针,因为没有其他类型的指针存在问题,人们可以猜测它是指向任何类似USART结构的指针当您使用微控制器时,使用指向结构的指针访问硬件是有意义的。@harper:但是宏是一个(强制转换的)指针,如果ptr也是一个指针,则开关中不需要强制转换(或者只转换到正确的指针类型,但肯定不转换为整数),这就是我要求更多信息的原因。什么类型是
ptr
?什么是
(USART\u TypeDef*)
?switch(reinterpret\u castptr))?您试图将指针强制转换为整数->
switch((uint32\u t)ptr)
@在CortexM3(STM32)等微控制器环境中,您发现所有硬件组件都被描述为结构。
USART\u Typedef
是USART(硬件组件)结构的Typedef
ptr
显然是一个指针,因为没有其他类型的指针存在问题,人们可以猜测它是指向任何类似USART结构的指针当您使用微控制器时,使用指向struct的指针访问硬件是有意义的。@harper:但是宏是一个(强制转换的)指针,如果ptr也是一个指针,那么在开关中就不需要强制转换(或者只需强制转换到正确的指针类型,但肯定不是整数),这就是为什么我需要更多信息。