如何在c中初始化泛型函数

如何在c中初始化泛型函数,c,generics,C,Generics,我正在尝试一个在c中使用泛型比较函数的简单示例,但是当初始化它时,我得到了一条警告消息,在初始化它们时,这些类型是不兼容的。感觉好像我错过了一些基本的东西 #include <stdio.h> #include <string.h> int compare(int (*comp)(void *first, void *second), void *arr, int size) { int i, j, dups=0, arrsize=sizeof(arr)/siz

我正在尝试一个在c中使用泛型比较函数的简单示例,但是当初始化它时,我得到了一条警告消息,在初始化它们时,这些类型是不兼容的。感觉好像我错过了一些基本的东西

#include <stdio.h>
#include <string.h>

int
compare(int (*comp)(void *first, void *second), void *arr, int size)
{
    int i, j, dups=0, arrsize=sizeof(arr)/size;
    for(i=0; i<arrsize; i++)
    {
        for(j=0; j<arrsize; j++)
        {
            if(j!=i)
                dups+=(*comp)(&arr[i], &arr[j]);
        }  
    }
     return dups;
}

int
compareints(int *first, int *second)
{
    if(*first==*second)
        return 1;
    return 0;
}

int main(int argc, const char * argv[])
{
    int (*comp)(void *, void *)=&compareints; //Here is where I get the warning...
    int arr[10]={22, 39, 78, 22, 99, 12, 82, 10, 11, 28};
    printf("The arr has dups: %d\n", compare(comp, arr, sizeof(int)));
    return 0;
}
#包括
#包括
int
比较(整数(*comp)(空*第一,空*第二),空*arr,整数大小)
{
int i,j,dups=0,arrsize=sizeof(arr)/size;

对于(i=0;i不幸的是,当它们是函数签名的一部分时,你不能这样混合
void*
int*
。即使
int*
可以转换为
void*
int(*)(int*,int*)
也不能转换为
int(*)(void*,void*)
。签名必须精确匹配

int
compareints(void *first, void *second)
{
    if (*((int *) first) == *((int *) second))
        return 1;
    return 0;
}

不幸的是,当它们是函数签名的一部分时,不能将
void*
int*
这样混合。即使
int*
可以转换为
void*
int(*)(int*,int*)
也不能转换为
int(*)(void*,void*)
。签名必须精确匹配

int
compareints(void *first, void *second)
{
    if (*((int *) first) == *((int *) second))
        return 1;
    return 0;
}
类型:

int compareints(int *first, int *second)
不等同于:

int (*comp)(void *first, void *second)
您必须更改函数的签名以接受两个void*参数,或在赋值过程中对其进行类型转换。

类型:

int compareints(int *first, int *second)
不等同于:

int (*comp)(void *first, void *second)

您必须更改函数的签名,以接受两个void*参数,或在赋值过程中对其进行类型转换。

Hi@John Kugelman,您是对的,警告消失了。但有一件事让我困惑:当作为void*传递时,是所有指针都是这样,还是只对int指针是这样?@patriques这与指针无关,这是规则对于函数指针。函数指针只有在其参数类型和返回类型完全匹配时才兼容。您好@John Kugelman,您好,警告消失了。但有一件事让我困惑:当作为void*传递时,是所有指针都是这样还是只对int指针是这样?@patriques这与指针无关,这是函数指针。函数指针只有在其参数类型和返回类型完全匹配时才兼容。