連結器與載入器與執行檔格式
在a.c與b.c中都定義了未加static、同名的全域函式void init(void),然後進行連結。下列關於會發生之情形的敘述,何者正確?
- A後連結的那個會被自動採用,不會出現錯誤
- B因同一個符號被定義了兩次,連結時會發生錯誤
- C兩個函式會被自動合併為一個,兩者的處理會依序執行
查看答案與解析
正確答案:B. 因同一個符號被定義了兩次,連結時會發生錯誤
未加static的全域函式,在整個程式中共用同一個名稱。若有兩個同名的定義,連結器無法決定該把參照連結到哪一個,因此會出現重複定義(multiple definition)錯誤。若是只在檔案內使用的函式,加上static使其無法從外部看見,即使其他檔案中有相同名稱也不會衝突。
- A. 對於一般的(強)符號,不會從中擇一。
- B. 正確。是重複定義的錯誤。
- C. 函式不會被合併。