qsort_r 在各大 C Standard Library 的實作狀況

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 的環境,應該都可以少一點負擔。

參考資料

Posted in Technical.

Leave a Reply

Your email address will not be published.

Captcha loading...