有可能只与拥有真正的函数来调用一个全局变量。 (是的,那太可怕了。)
有一个原因:只有明显参数的函数指针不能代表关闭。有qsort
接受类型的指针
int (*)(void *closure, const void*, const void*)
和void*
通过它每次比较,就可以写一个转换器:
struct char_qsorter {
int (*function)(void*, const char*, const char*);
void *param;
};
struct qsorter {
int (*function)(void*, const void*, const void*);
void *param;
};
int char_qsort_wrapper(void *closure, const void *a, const void *b) {
const char_qsorter *const cq=closure;
return cq->function(cq->param, a, b);
}
qsorter convert(const char_qsorter *cq) {
const qsorter ret={char_qsort_wrapper, cq};
return ret;
}
/* Convert a plain function pointer: */
int trivial_wrapper(void *closure, const char *a, const char *b) {
return (*(int (*const *)(const char*, const char*))closure)(a, b);
}
char_qsorter trivial_closure(int (*const *f)(const char*, const char*)) {
const char_qsorter ret={trivial_wrapper, f};
return ret;
}
void sort_strings(const char *const *ss, size_t n) {
int (*const f0)(const char*, const char*)=strcmp;
const char_qsorter cq=trivial_closure(&f0);
const qsorter q=convert(&cq);
qsort_closure(ss, n, sizeof(*ss), q.function, q.param);
/* or just pass q if the library used the struct */
}
我认为这是显而易见的,为什么在实践中人们更喜欢硬编码解决方案就足够了。 (真的,懒惰的程序员只是通过strcmp
直接,工作于大部分的实现。)
C11的确与qsort_s
支持这一点,但它是一个特殊的可选功能检查与添加怪异运行时错误。
想象我的脑子太深入功能编程。谢谢你的回答! – Sam
@ Sam很高兴我能帮到你。如果您觉得它有用,请随时[接受此答案](https://stackoverflow.com/help/accepted-answer)。 – dbush