如何在c中初始化泛型函数
我正在尝试一个在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
#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这与指针无关,这是函数指针。函数指针只有在其参数类型和返回类型完全匹配时才兼容。