天天看點

Linux C筆記之 連結屬性 詳解

連結屬性:

          當組成一個程式的各個源檔案分别被編譯之後,所有的目标檔案以及那些從一個或多個函數庫中引用的函數連結在一起,形成可執行程式。然而,如果相同的辨別符出現在幾個不同的源檔案中時,它們是表示同一個實體?

          辨別符的連結屬性決定如何處理在不同檔案中出現的辨別符。辨別符的作用域與它的連結屬性有關,但不相同。

         連結屬性共有3種—— external (外部)、internal (内部)、none(無);

         none(無)辨別符總是被當成單獨的個體,也就是說該辨別符的多個聲明被當成獨立不同的實體。

         internal(内部)辨別符在同一個源檔案内的所有聲明都指向同一個實體,但位于不同源檔案的多個聲明則分屬不同的實體。

         external(外部)辨別符不論聲明多少次,位于幾個源檔案都表示同一個實體。

         圖中通過展示名字聲明的所有不同方式,描述了連結屬性。在預設情況下,辨別符 b 、c 和 f 的連結屬性為external ,其餘辨別符的連結屬性則為 none 。是以,如果另一個源檔案也包含了辨別符 b 的類似聲明并調用函數 c ,它們實際上通路的是這個源檔案所定義的實體。f 的連結屬性之是以是 external 是因為它是個函數名。在這個源檔案中調用函數 f ,它實際上将連結到其他源檔案所定義的函數,甚至這個函數的定義可能出現在某個函數庫。

Linux C筆記之 連結屬性 詳解
Linux C筆記之 連結屬性 詳解
Linux C筆記之 連結屬性 詳解

修改連結屬性:

        關鍵字 extern 和 static 用于在聲明中修改辨別符的連結屬性。如果某個聲明在正常情況下具有 external 連結屬性,在它前面加上 static 關鍵字可以使它的連結屬性變為 internal 。如:         static       int        b;

        那麼變量 b 就将為這個源檔案所私有。在其他源檔案中,如果也連結到一個叫做 b 的變量,那麼它所引用的是另一個不同的變量。類似,你也可以把函數聲明為 static ,如:

        static       int        c(int       d);

        這樣就可以防止它被其他源檔案調用。

        static 隻對預設連結屬性為 external 的聲明才有改變連結屬性的效果。例如,你盡管可以在聲明5前面加上 static

關鍵字,但它的效果完全不同,因為 e 的連結屬性并不是 external 。         extern 關鍵字的規則很複雜 。它為一個辨別符指定 external 連結屬性,這樣就可以通路在其他任何位置定義的這個實體。