C函数中的指针需要无符号类型数组,但我的数组是有符号的

pointer in C function needs unsigned type array, but my array is signed

我有如下函数处理包含在 unsigned char 类型数组中的信息:

unsigned char LRCsimple(unsigned char *p, createLRC , unsigned char length)
{

}

适用于大多数无符号字符数组。

现在,我有一个带符号的数组,当我使用这样的函数时它工作得很好,但是在编译代码时我有一个警告:

> ../src/apptcpipserver.c:102:9: warning: pointer targets in passing argument 1 of 'LRCsimple' differ in signedness [-Wpointer-sign]
         if (0x01 == LRCsimple(apptcpipserverData.cRxedData,0x00,(apptcpipserverData.cRxedData[0x02] - 0x02)))

如果我想避免这个警告,我认为最优的解决方案是创建一个类似于上面的函数,但是对于有符号数组,如下:

unsigned char signedLRCsimple(char *p, createLRC , unsigned char length)
{

}

或者我还能做些什么来避免出现该警告消息?

严格的别名规则允许 unsigned charchar 别名。因此,您应该能够重用 LRCsimple 来处理 char*.

因此 signedLRCsimple 可以实现为:

unsigned char signedLRCsimple(char *p, createLRC xxx, unsigned char length)
{
   return LRCsimple((unsigned char*)p, xxx, length);
}

为了避免强制客户端更改代码以使用 signedLRCsimple,您可以使用 generic selection 在 C11 中以 [=18= 的形式引入].通常它用于 select 基于 _Generic.

第一个参数类型的函数指针
#define LRCsimple(p, xxx, length)          \
  _Generic((p), unsigned char*: LRCsimple, \
                char *: signedLRCsimple)(p, xxx, length)

每当 LRCsimple 被称为通用 selection selects 在 unsigned char*LRCsimple 和 [=15= 的 signedLRCsimple 之间].对于其他类型,会引发错误。