c - 为什么 IAR 在 void* 上抛出错误

标签 c void iar

我想将一个使用 gcc 的项目移植到 IAR 编译器,但 IAR 提示几个函数使用 void* 作为形式参数。

 struct 
 {
    uint16_t ConnectionHandle;
    uint8_t  Reason;
 }DisconnectParams;

函数原型(prototype)是

bool Bluetooth_HCI_SendControlPacket(BT_StackConfig_t* const StackState,
                                     const uint16_t OpCode,
                                     const uint8_t Length,
                                     const void* Data);

使用的是:

Bluetooth_HCI_SendControlPacket(StackState, (OGF_LINK_CONTROL | OCF_LINK_CONTROL_DISCONNECT), sizeof(DisconnectParams), &DisconnectParams);

这里投诉 错误[P​​e167]:“struct *”类型的参数与“void const *”类型的参数不兼容

还有一个地方

static inline void SDP_WriteData8(void** BufferPos,const uint8_t Data)
{
*((uint8_t*)*BufferPos) = Data;
*BufferPos += sizeof(uint8_t);
}

错误[Pe852]:表达式必须是指向完整对象类型的指针。 据我所知,void* 可以接受任何指针,如何更改代码以消除这些错误?谢谢!

克里斯

最佳答案

就您的第二个问题而言,该代码无效,因为您拥有的是 void * 并且您正试图将其递增 sizeof(uint8_t) (我假设为 1)。这相当于:

void *p;
p += 1;

您不能对具有不完整类型的指针执行指针算术运算,因为编译器不知道该值如何递增(请记住它是根据所指向对象的大小递增)。

您可能打算在递增之前将指针转换为 uint8_t 指针。

关于c - 为什么 IAR 在 void* 上抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9978412/

相关文章:

c - Linux 系统调用 clock_settime(...) 在 Docker 容器中因 EPERM 失败

c++ - decltype(void()) 和 decltype(void{}) 的区别

android - 使方法在android中连续运行

c++ - 是否有任何理由在 C 中声明 "volatile const"而在 C++ 中仅声明 "volatile"?

c - 在哪里可以找到最小边界框算法的 c/c++ 实现?

c - 如何处理加密字符串?

c++ - 将 vector 作为空指针传递给函数

c - IAR 的新 EWAVR32 (4.20)。编译器对内联汇编更加严格

c - 打印数据到不同终端IAR

python - 优化sympy生成的代码