0

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

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

克里斯

4

2 回答 2

3

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

void *p;
p += 1;

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

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

于 2012-04-02T14:47:27.323 回答
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
于 2012-04-02T15:49:12.800 回答