取消引用指向结构的指针 - 使间接操作数无效?
Dereferencing a pointer to a struct - invalide indirection operand?
我想取消对结构指针的引用。此代码使用 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
当我删除强制转换时,它会编译。
但是我不明白为什么!!有人可以解释一下吗
最初的错误似乎是由参数名称中的印刷错误引起的。据推测,标识符 GPIOX
是在您的真实代码中定义的,即使您没有在您的问题中提出这样的声明,所以您得到了 "invalid indirection" 错误,而不是一个调用未知标识符的错误。
关于您的更新 2,您的编译器有点挑剔,但它是正确的。 C 要求转换表达式
Unless the type name specifies a void type, the type name shall
specify atomic, qualified, or unqualified scalar type, and the operand
shall have scalar type.
(C2011 6.5.4/2;已强调)
在您的情况下,类型名称指定结构类型(因此不是标量类型),因此您的代码不符合要求。当然,强制转换是完全没有必要的,因为它的操作数的类型已经与强制转换中指定的类型名称相同。
gcc
会为我发出警告,但仅当 -pedantic
选项生效时。其他符合标准的编译器可以自由地拒绝代码。
我想取消对结构指针的引用。此代码使用 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
当我删除强制转换时,它会编译。
但是我不明白为什么!!有人可以解释一下吗
最初的错误似乎是由参数名称中的印刷错误引起的。据推测,标识符 GPIOX
是在您的真实代码中定义的,即使您没有在您的问题中提出这样的声明,所以您得到了 "invalid indirection" 错误,而不是一个调用未知标识符的错误。
关于您的更新 2,您的编译器有点挑剔,但它是正确的。 C 要求转换表达式
Unless the type name specifies a void type, the type name shall specify atomic, qualified, or unqualified scalar type, and the operand shall have scalar type.
(C2011 6.5.4/2;已强调)
在您的情况下,类型名称指定结构类型(因此不是标量类型),因此您的代码不符合要求。当然,强制转换是完全没有必要的,因为它的操作数的类型已经与强制转换中指定的类型名称相同。
gcc
会为我发出警告,但仅当 -pedantic
选项生效时。其他符合标准的编译器可以自由地拒绝代码。