size_t/unsigned int?讀者「和平」觀察到:C++ Primer 建議容量類變量用 size_t(無符號、語義清晰),但 Linux 系統調用大量使用有符號 int。這看似浪費一半表示範圍,實則蘊含深刻的工程文化差異。
| 維度 | Windows (Microsoft) | Unix/Linux (AT&T, BSD, GNU...) |
|---|---|---|
| 目標用戶假設 | 廣義程序員(含非專業背景) | 同級系統程序員 |
| 類型系統 | 豐富 typedef:HANDLE, DWORD, SOCKET... | 極簡統一:int 包打天下 |
| 錯誤碼傳遞 | 專用類型 + 巨集:INVALID_SOCKET = ~0 | 統一約定:返回 -1 表示失敗 |
| 學習曲線 | 陡峭(需背誦大量類型) | 平緩(掌握 int 即通吃) |
| 誤用保護 | 編譯期強類型檢查 | 運行期約定自理 |
int 的三大工程紅利int。內核以數組/哈希表索引,O(1) 查找,極致高效。read(fd, buf, n) 成功返回 ≥0 字節數,失敗返回 -1。無需額外 bool& success 參數,也無需犧牲最大值作為哨兵(如 Windows INVALID_HANDLE_VALUE)。read/write/close/ioctl 操作文件、管道、Socket、終端、設備。int 的通用性支撐了「一切皆文件」的系統抽象。SOCKET 的無符號陷阱typedef unsigned int SOCKET; // 實為 UINT_PTR
#define INVALID_SOCKET (SOCKET)(~0) // 0xFFFFFFFF
導致 accept() 等函數無法用返回值直接判斷成敗,必須額外檢查 == INVALID_SOCKET。更糟的是,SOCKET 實際範圍遠小於 32 位,高位永遠浪費。Unix 直接用 int sockfd,-1 即錯誤,簡潔有力。
int 範圍真的不夠嗎?int 21 億倍富餘read/write 受限於內存/協議窗口,極少超 2GBoff_t/size_t 專用類型夠用就好,避免過度設計——這是 Unix 實用主義的核心。
《0bug-C/C++商用工程之道》工程庫採用:
int 返回值、-1 表錯、0/正數表成功)size_t/uint32_t 明確語義白貓黑貓,抓到耗子就是好貓。工程無教條,合用為王。