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 char
和 char
别名。因此,您应该能够重用 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
之间].对于其他类型,会引发错误。
我有如下函数处理包含在 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
,您可以使用 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
之间].对于其他类型,会引发错误。