作者:
Tverous (Orah~)
2017-08-04 09:18:53開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
問題(Question):
最近在c primer plus中看到一段有關使用全域變數的一種方法
/* constant.h
你沒有加static又給多個.c檔include應該就會link error
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關掉