typedef void* ListElement;
typedef int(*CompareListElements)(ListElement, ListElement);
ListResult listSort(List list, CompareListElements compareElement) {
.
.
.
qsort(arr, size, sizeof(*arr), compareElement);
.
.
.
}
前两行是澄清什么是CompareListElements.
当我将compareElement
作为参数发送到库函数时,qsort'我收到这些警告信息:
passing argument 4 of 'qsort' from incompatible pointer type [enabled by default]
我该如何解决这个问题?
答案 0 :(得分:4)
重写比较器,使其与qsort()
期望的匹配:
typedef int (*CompareListElements)(const void *, const void *);
在比较器内部,转换为正确的类型:
int compare_elements(const void *v1, const void *v2)
{
const RealType *p1 = v1;
const RealType *p2 = v2;
…do comparison…
return …;
}
这样,您根本不会转换函数指针。 RealType
是隐藏在(选择不当)背后的类型:
typedef void *ListElement;
真实类型不是void
;它可能是一些结构类型。请注意,使用void *
作为列表元素类型几乎失去了C可用的所有类型安全性(可以说它开始时可能不够)。你可以做得更好:
typedef struct Element ListElement;
或类似的东西,并将指针传递给ListElement
。 (另请参阅Is it a good idea to typedef
pointers?。您可能还会发现How to sort an array of structs in C?有帮助,毫无疑问其他相关问题也会有所帮助。)。