问题描述
我正试图在c中编写一个通用函数,该函数接受两个未知类型的参数并将其进行比较,但是显然我要从void *引用到void,这是很愚蠢的事情,但是我该如何转换'a '和'b'如果我不知道它们将是哪种类型?
int compare(void* a,void* b)
{
if(*a < *b)
{
return -1;
}
else if(*a > *b)
{
return 1;
}
return 0;
}
解决方法
鉴于您不知道可以将memcmp
用作suggested by @pmg的类型。
#include <string.h>
//...
int compare(void* a,void* b,size_t size)
{
return memcmp(a,b,size);
}
在size
参数中,如果它们的大小不同,例如,两个长度不同的字符串,则希望传递较大的对象的大小。
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
返回值:
<0
在两个内存块中都不匹配的第一个字节在ptr1中的值小于在ptr2中的值(如果被评估为无符号字符值)。
0
两个存储块的内容相等。
>0
两个内存块中不匹配的第一个字节在ptr1中的值大于在ptr2中的值(如果被评估为无符号字符值)
如果愿意,您可以指定不同的返回值,但是如果您不专门指定-1、0和1,这些返回值似乎与您需要的返回值非常匹配。
int x = 10;
int y = 20;
int res = compare(&x,&y,sizeof x);
res
的值很可能是<0
,-1
。
当您知道类型只是将它们重新转换为传递给函数的参数的类型时,就可以说它们是int
的类型:
//...
if(*(int*)a < *(int*)b)
{
return -1;
}
else if(*(int*)a < *(int*)b)
//...
请注意,如果将其用作qsort
比较函数,则该参数将不适用,因为qsort
的参数之一恰好是类型大小,因此您需要针对每种类型的比较函数想比较。