我想将一个使用 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);
这里投诉 错误[Pe167]:“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/