取消引用指向struct - invalide间接操作数的指针?

Sal*_*din 0 c struct pointers dereference

我想知道指向结构的指针.该代码使用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);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这段代码时,会发生错误:invalid indirection operand.为什么编译器拒绝这段代码?

注意:代码基于STM标准库.

更新:

我知道我可以使用->运算符访问struct成员但我仍然希望将struct成员保存在与结构相同类型的变量中以用于某些测试目的.我只想在这个时间点获得寄存器的快照.

更新2

使用上面发布的代码我得到另一个错误 invalid cast type

当我删除演员表时,它会编译.

但我不明白为什么!! 请有人解释一下

Joh*_*ger 6

原始错误似乎是由参数名称中的印刷错误引起的.据推测,标识符GPIOX是在您的实际代码中定义的,即使您没有在您的问题中提供此类声明,因此您会收到"无效间接"错误,而不是调出未知标识符.

关于您的更新2,您的编译器是挑剔的,但它是正确的.C需要使用强制转换表达式

除非类型名称指定void类型,否则类型名称应指定原子,限定或非限定标量类型,操作数应具有标量类型.

(C2011 6.5.4/2 ;强调增加)

在您的情况下,类型名称指定结构类型(因此不是标量类型),因此您的代码不符合要求.当然,无论如何,转换都是不必要的,因为它的操作数的类型已经与转换中指定的类型名称相同.

gcc我会发出警告,但只有在-pedantic选项生效时才会发出警告.其他符合要求的编译器可以自由拒绝代码.