[問題] 外部變數static問題

作者: Tverous (Orah~)   2017-08-04 09:18:53
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
問題(Question):
最近在c primer plus中看到一段有關使用全域變數的一種方法
/* constant.h
作者: james732 (好人超)   2017-08-04 09:32:00
你沒有加static又給多個.c檔include應該就會link error
作者: Hazukashiine (私は幸せです)   2017-08-04 09:35:00
compile 的下一步是 link, 如果沒有用 static 指定是 internal linkage, 可能會造成識別符名稱的汙染
作者: Tverous (Orah~)   2017-08-04 10:45:00
想請問汙染具體來說是怎樣?因為假如使用個區域變數不是就直接隱藏掉全域變數嘛?
作者: stucode   2017-08-04 11:35:00
沒有用static修飾的file-scope變數是external linkage這表示它可以被任何編譯單元參考到以你的例子而言 file1跟file2會各有一個變數定義假設沒有用static修飾 當程式中使用到該變數時linker會不知道要將其鏈結到哪個變數定義相對來說 若是加了static 在file1中的變數定義就只會在file1中使用時被看見 file2同理至於你會沒有遇到錯誤 可能是你個別編譯兩個檔案並且沒有鏈結它們 又或是像書中所寫鏈結器幫你做了不合標準的額外處理
作者: Tverous (Orah~)   2017-08-04 12:15:00
大概了解了 感謝各位前輩
作者: PkmX (阿貓)   2017-08-05 01:18:00
題外話其實C標準J.5.11 Multiple External Definition有特別提到很多實作都會支援可以多個定義 只要不打架就好例如全域變數如果沒有初始化gcc會預設把他們都丟到commonsection內 而linker會把所有object file的common symbol合併所以就算有多個定義只要大小一樣也是ok的這個功能可以在編譯的時候下gcc -fno-common關掉

Links booklink

Contact Us: admin [ a t ] ucptt.com