qsort_r
是個與 qsort
類似,但不包含在 ISO C 標準內的 function。因為非標準,不是每個 C standard library 都有實作,有實作的參數定義也不一定一致。最近發現 musl 加入了 qsort_r
的實作,就來彙整一下相關資訊。
qsort_r
實作檢查表#
C Standard Library | qsort_r 引入日期 |
---|---|
glibc | 2007-11-13 |
uClibc-ng | 2011-11-07 |
musl | 2021-09-23 |
newlib | 2014-12-05 |
minimal libc | 2021-11-10 |
FreeBSD libc | 2002-09-10 |
MSVC | N/A |
qsort_r
參數定義的不一致#
主要分為 GNU 風格的 BSD 風格的,兩者參數順序不同。大略上來說,除了 FreeBSD, macOS 這類的系統會採用 BSD 風格之外,其餘的都偏好使用 GNU 風格。
qsort_s
?#
C11 裡面其實有新定義一個 function 叫 qsort_s
,跟 GNU 風格的 qsort_r
參數順序一致。不過一方面是 C11 比較新,另一方面是這個定義歸在 C Library Extension 1 裡面,目前實作的 C standard library 少之又少。
FreeBSD 為了方便使用 GNU 風格 qsort_r
的程式做移植,在 2020-01-20 實作了 qsort_s
。
MSVC 也有實作 qsort_s
,但參數順序跟其他人都不一樣。明明這次 C11 就有定義,不知道 Microsoft 在想什麼……
結論#
前幾年因為維護的問題,有大批使用 uClibc 的系統跳槽改用 musl(如 OpenWrt、Yocto、Alpine Linux 等),就時常要面對當時 musl 沒有 qsort_r
可以用的問題(像是 systemd 裡面就有用 qsort_r
)。2021 年末之後,主流 C standard library 裡面有些沒 qsort_r
的這個缺口看來被補得差不多。未來無論是要移植程式到 embedded Linux、RTOS 還是 non-OS 的環境,應該都可以少一點負擔。