PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 外部變數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關掉
繼續閱讀
Re: [公告] 板工請假七天
wtchen
[問題] 二維陣列型別
oToToT
[問題] __attribute__ ((aligned (8)));
SKTP
[問題] 所有c++程式突然都不能跑
a88241050
[問題] 新手問題 傳入陣列的size
nova06091
Re: [分享] CMake裡面直上Google Test
druid0214
[問題] online judge 上一題如何加速運算?
ddchris
[公告] 板工請假七天
wtchen
[分享] CMake裡面直上Google Test
Killercat
[問題] C語言xcode檔案輸入輸出
egg1127
Links
booklink
Contact Us: admin [ a t ] ucptt.com