如何初始化c中的generics函数

我在c中尝试使用generics比较函数的一个简单示例,但在初始化时,我得到的警告信息是类型在初始化时不兼容。 感觉我在这里缺少一些基本的东西……

#include  #include  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; } 

编辑:程序运行不正常,它与数组的处理有关。 function编程的修改如下:

 int compare(int (*comp)(void *first, void *second), void **arr, int size) .... .... .... dups+=(*comp)(arr[i], arr[j]); int compareints(....) if((*((int *)first))==(*((int *)second))) return 1; int main(int argc, const char * argv[]) { int (*comp)(void *, void *)=&compareints; int arr[10]={22, 39, 78, 22, 99, 12, 82, 10, 11, 28}; void **arr2=malloc(sizeof(int *)*10); for(int i=0; i<10; i++) { arr2[i]=&arr[i]; } printf("The arr has dups: %d\n", compare(comp, arr2, 10)); 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 *参数,或者在赋值期间对其进行类型转换。