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



我有一个函数,它处理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,您可以使用泛型选择在C11中以_Generic的形式引入。通常用于根据_Generic的第一个实参的类型选择函数指针。

#define LRCsimple(p, xxx, length)          
_Generic((p), unsigned char*: LRCsimple, 
char *: signedLRCsimple)(p, xxx, length)

当调用LRCsimple时,通用选择在unsigned char*LRCsimplechar*signedLRCsimple之间选择。对于其他类型则抛出错误。