如何初始化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 *参数,或者在赋值期间对其进行类型转换。