我有一个函数,它处理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 char
和char
混叠。因此,您应该能够重用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*
的LRCsimple
和char*
的signedLRCsimple
之间选择。对于其他类型则抛出错误。