我正在编写一个函数,它接收一个指向比较函数的指针和一个数组MyStructs
并应该根据比较函数对数组进行排序:
void myStructSort(
struct MyStruct *arr,
int size,
int (*comp)(const struct MyStruct *, const struct MyStruct *)) {
qsort(arr, size, sizeof(struct MyStruct), comp);
}
不幸的是这不能编译,因为qsort
期望比较器接收void *
论点而不是const struct MyStruct *
。我想到了几个不好的解决方案,并想知道正确的解决方案是什么。
Option 1
Cast comp
to int (*)(const void *, const void*)
。这可以编译,但是未定义的行为(请参阅这个问题 https://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type).
Option 2
创建全局变量int (*global_comp)(const struct MyStruct *, const struct MyStruct *)
并设置global_comp=comp
inside myStructSort
。然后创建一个函数:
int delegatingComp(const void *a, const void *b) {
return globalComp((const struct MyStruct *)a, (const struct MyStruct *)b);
}
And in myStructSort
call qsort(arr, size, sizeof(struct MyStruct), delegatingComp)
。问题在于令人讨厌的全局变量。
Option 3
重新实现qsort
。这在功能上是安全的,但却是非常糟糕的做法。
有没有神奇的完美第四种选择?
Edit
我无法更改 APImyStructSort
我正在使用编译我的代码gcc c99 -Wall -Wextra -Wvla
.