基礎知識 | 每日一練(122)
- 2019 年 10 月 6 日
- 筆記
讀者:我想用 qsort() 對一個結構數組排序。我的比較函數接受結構指針,
但是編譯器認為這個函數對於 qsort() 是錯誤類型。我要怎樣轉換這個函數指針才能避免這樣的警告?
這個轉換必須在比較函數中進行, 而函數必須定義為接受 「一般指針」 (const void*) 的類型,。
比較函數可能像這樣:
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 指針, 編譯器隱式的進行了類型轉換。
另一方面, 如果你對結構的指針進行排序, 你需要間接使用:sp1 = *(struct mystruct * const *)p1。
一般而言, 為了讓編譯器 「閉嘴」 而進行類型轉換是一個壞主意。
編譯器的警告資訊通常希望告訴你某些事情, 忽略或輕易去掉會讓你陷入危險, 除非你明確知道你在做什麼。