我想使用gcc将项目移植到IAR编译器,但是IAR抱怨使用void *作为形式参数的几个函数。
struct
{
uint16_t ConnectionHandle;
uint8_t Reason;
}DisconnectParams;
函数原型是
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 *可以接受任何指针,如何更改代码以删除这些错误?谢谢!
克里斯
答案 0 :(得分:3)
关于你的第二个问题,代码是无效的,因为你所拥有的是一个void *,你试图通过sizeof(uint8_t)递增它(我假设1)。这相当于:
void *p;
p += 1;
您不能对具有不完整类型的指针执行指针算术,因为编译器不知道该值如何递增(记住它取决于指向的对象的大小)。
你可能想在递增之前将指针强制转换为uint8_t指针。
答案 1 :(得分:0)
#ifdef I_JUST_LOVE_MYSTERIOUS_COMPILER_ERRORS
struct
{
uint16_t ConnectionHandle;
uint8_t Reason;
}DisconnectParams;
#else
typedef struct
{
uint16_t ConnectionHandle;
uint8_t Reason;
}DisconnectParams_t;
DisconnectParams_t DisconnectParams;
#endif