靜態型態檢查的限制
靜態型態檢查在編譯時期進行,可以捕捉到許多型態錯誤。然而,在模組化程式設計中,由於不同模組可能在不同時間被編譯,這會引起一些問題,使得靜態型態檢查無法完全核對所有型態是否相符。
原因分析
-
分開編譯(Separate Compilation):
- 在 C 語言中,程式通常會分成多個模組(例如多個 .c 檔案),每個模組可以獨立編譯成目標檔案(.o 或 .obj)。
- 編譯每個模組時,編譯器只能檢查該模組內的型態一致性,而無法檢查不同模組之間的型態一致性。
-
外部宣告(External Declarations):
- 在多個模組之間,共享資料或函數通常會通過 extern 關鍵字聲明。
- 靜態型態檢查只能確保在同一個翻譯單元(translation unit)內型態一致,而無法跨翻譯單元進行全面檢查。例如,在模組 A 中宣告的外部變數,在模組 B 中可能會有不同的宣告型態,但編譯時無法檢查這種不一致性。
-
連結過程(Linking Process):
- 連結器(Linker)在將各個編譯好的目標檔案連結成最終可執行檔時,無法進行詳細的型態檢查。它只確保符號(如變數和函數名)在各模組之間的一致性,但不檢查符號的型態。