c - 取消引用指向结构的指针 - 使间接操作数无效?
问题描述
我想取消引用指向结构的指针。此代码使用 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
是在您的真实代码中定义的,即使您没有在问题中提出这样的声明,所以您会得到“无效间接”错误,而不是调用未知标识符。
关于您的更新 2,您的编译器很挑剔,但它是正确的。C 要求强制转换表达式
除非类型名称指定 void 类型,否则类型名称应指定原子的、合格的或不合格的标量类型,并且操作数应具有标量类型。
(C2011 6.5.4/2;强调添加)
在您的情况下,类型名称指定结构类型(因此不是标量类型),因此您的代码不符合要求。当然,无论如何都不需要强制转换,因为其操作数的类型已经与强制转换中指定的类型名称相同。
gcc
将为我发出警告,但仅在-pedantic
选项生效时。其他符合标准的编译器可以自由地拒绝代码。
推荐阅读
- facebook - Facebook 用户令牌
- replication - 如何将gerrit更改镜像到另一个gerrit?
- c# - 将构造函数参数传递给自动映射器中的成员
- python - 使用 python 绘制一个多列堆叠条形图,其中为 x 轴的每个值提供两个相似的条形图
- ruby - 在 VScode 中找不到带有可执行 rspec (Gem::GemNotFoundException) 的 gem rspec-core (>= 0.a)
- python - matplotlib 3D:多行
- python - 从数据框中删除相同的行-Pandas
- javascript - 有没有办法将视频从网页直接发送到 Instagram 的故事编辑页面?
- .net - 如何使用 X-Ray 检测 Dynamodb 请求?
- kotlin - 在可变映射中将所有键映射为 false 的更好方法