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

时间:2012-04-02 14:39:29

标签: c void iar

我想使用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);

在这里抱怨 错误[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 *可以接受任何指针,如何更改代码以删除这些错误?谢谢!

克里斯

2 个答案:

答案 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