我想降低指向结构的指针。该代码使用COSMIC编译器编译,并下载到STM8S微控制器。
以下是我在代码中遇到的问题:
typedef struct GPIO_struct
{
volatile unsigned char CR1;
volatile unsigned char CR2;
}
GPIO_TypeDef;
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
// This variable will be used for a testing purpose
GPIO_TypeDef vGPIO = (GPIO_TypeDef)*GPIOx; // HERE IS THE PROBLEM
}
int main(void)
{
GPIO_TypeDef GPIOY @0x5000; // Reference to an absolute address
GPIO_DeInit(&GPIOY);
}
当我尝试此代码时,会发生错误:invalid indirection operand
。为什么编译器拒绝这段代码?
注意:代码基于STM标准库。
更新
我知道我可以使用->
运算符访问结构成员但我仍然希望将结构成员保存在与结构相同类型的变量中,以用于某些测试目的。我只想在这个时间点获得寄存器的快照。
更新2
上面发布的代码我收到了另一个错误invalid cast type
当我删除演员表时,它会编译。
但我不明白为什么!请有人解释一下
答案 0 :(得分:6)
原始错误似乎是由参数名称中的印刷错误引起的。据推测,标识符GPIOX
是在您的真实代码中定义的,即使您没有在您的问题中提出这样的声明,这样您就会得到"无效的间接"错误而不是一个调用未知标识符。
关于您的更新2,您的编译器很挑剔,但它是正确的。 C需要使用
的强制转换表达式除非类型名称指定void类型,否则类型名称应为 指定原子,限定或不合格的标量类型和操作数 应具有标量类型。
(C2011 6.5.4/2;重点补充)
在您的情况下,类型名称指定结构类型(因此不是标量类型),因此您的代码不符合要求。当然,无论如何,转换都是不必要的,因为它的操作数的类型已经与转换中指定的类型名称相同。
gcc
会针对我发出警告,但仅在-pedantic
选项生效时才会发出警告。其他符合要求的编译器可以自由拒绝代码。