参数未知的c中的通用比较器函数

问题描述

我正试图在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,这些返回值似乎与您需要的返回值非常匹配。

Sample use case

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的参数之一恰好是类型大小,因此您需要针对每种类型的比较函数想比较。