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