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。
参考资料: [ISO, Sec. 7.10.5.2]; [H&S, Sec. 20.5 p. 419]。
翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)