14.7 我想用 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

參考資料: [ISO, Sec. 7.10.5.2]; [H&S, Sec. 20.5 p. 419]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)