這週末升級了一下開發環境的 toolchain,編著編著發現一些第三方函式庫用純 C 寫的居然編不過了。
看了一下 GCC 15 開始會預設啟用 -std=c23 模式,所以治標的解法是 CFLAGS 加上 -std=gnu17 就行了。
詳細的理由可以看到錯誤訊息再去翻 C23 有什麼差別就好,反正 C 語言非常小,也沒有迷路問題,這邊就不去罵哪些古人不會寫程式了。
上次 C 語言圈子出現類似問題已經是 GCC 3.3 到 3.4 時代 varargs.h 轉 stdarg.h 的事了,當時也是炸了一堆東西,很多開放原始碼的程式被長期鎖在 GCC 3.3,畢竟那次不是改個參數就完結的。記得到 GCC 上了 4.x 以後大學的學弟想編譯 Maple BBS 某分支的原始碼,編譯不過跑去問作者,還被作者嗆幹嘛用那麼新的 GCC,而那個時間點其實離 GCC 3.4 問世已經有相當長的時間了,更不用說當時已經離 C89 問世的時間更久遠,GCC 忍到 3.4 才丟掉它已經很佛心了。總之這次變動其實還算是溫和的,只是不修的話,那個專案也沒辦法用到 C23 的 features 就是了,C23 可是多了不少被敲碗已久的東西,想用就乖乖把程式改好吧,都什麼年代了還在 enum 裡面放小寫 true、false 是怎樣。
另外特別值得一提的是,在執行期錯誤方面,喜歡用 realloc() 送 size 0 代替 free() 的可能要小心了,這東西在 C23 開始變成未定義行為,雖然我覺得各家編譯器的實作方式不會立即產生改變,但請想想當年的 strict aliasing 災難,愛用這招耍帥的請趁早改邪歸正。
不過根據遙遠的過往的經驗,有人被這些炸死上網搜尋才看到這篇的時間點,應該至少也是距這篇發文時間的 3 ~ 5 年後了。希望是不要這麼墮落,都 AI 時代了,還這麼懶的真的要檢討,想想當年剛有 ChatGPT、Claude、Gemini、Perplexity、Consensus,有 GitHub Copilot、Cursor、Windsurf、Roo Code (Root Cline、Cline、Claude Dev)、Continue 這些鬼東西的時期,你是用 AI 讓自己過得更混呢,還是讓自己變得更充實?