问题:
我想用qsort() 对一个结构数组排序。
我的比较函数接受结构指针,但是编译器认为这个函数对于qsort() 是错误类型。
我要怎样转换这个函数指针才能避免这样的警告?
这个转换必须在比较函数中进行, 而函数必须定义为接受“一般指针” (const void*) 的类型, 就象上文问题13.6 中所讨论的。
比较函数可能像这样:
int mystructcmp(const void *p1, const void *p2)
{
const struct mystruct *sp1 = p1;
const struct mystruct *sp2 = p2;
/* 现在比较sp1->whatever 和sp2-> ... */
从一般指针到结构mystruct 指针的转换过程发生在sp1 = p1 和sp2 = p2 的初始化中; 由于p1 和p2 都是void 指针, 编译器隐式的进行了类型转换。
另一方面, 如果你对结构的指针进行排序, 则如问题13.6 所示, 你需要间接使用:sp1 = *(struct mystruct * const *)p1。
一般而言, 为了让编译器“闭嘴” 而进行类型转换是一个坏主意。
编译器的警告信息通常希望告诉你某些事情, 忽略或轻易去掉会让你陷入危险, 除非你明确知道你在做什么。
参见问题4.5。