連結器與載入器與執行檔格式

在a.c與b.c中都定義了未加static、同名的全域函式void init(void),然後進行連結。下列關於會發生之情形的敘述,何者正確?

  1. A後連結的那個會被自動採用,不會出現錯誤
  2. B因同一個符號被定義了兩次,連結時會發生錯誤
  3. C兩個函式會被自動合併為一個,兩者的處理會依序執行
查看答案與解析

正確答案:B. 因同一個符號被定義了兩次,連結時會發生錯誤

未加static的全域函式,在整個程式中共用同一個名稱。若有兩個同名的定義,連結器無法決定該把參照連結到哪一個,因此會出現重複定義(multiple definition)錯誤。若是只在檔案內使用的函式,加上static使其無法從外部看見,即使其他檔案中有相同名稱也不會衝突。

  • A. 對於一般的(強)符號,不會從中擇一。
  • B. 正確。是重複定義的錯誤。
  • C. 函式不會被合併。
練習這個領域 前往領域頁面

連結器與載入器與執行檔格式的其他題目

  1. 在C語言中以static定義函式時(例:static int helper(void)),下列關於其效果的敘述何者正確?
  2. 在C語言中寫下「extern int count;」時,下列關於其意義的敘述何者正確?
  3. 關於Linux等系統常用的ELF格式檔案,下列何者正確?
  4. 執行檔的.text區段中存放的是下列何者?
  5. 在C語言中,寫在檔案外側的全域變數「int limit = 100;」,一般會放在哪個區段?

這個領域的比較