看板 C_and_CPP 關於我們 聯絡資訊
請問大家有關static 的問題 問題一 假設現在有個宣告 static int This = 0; 我看書上寫的是如果在.c檔中做這樣的宣告(全域), 只有在該.c檔可以使用他 那現在問題來了 我今天把他寫在.h檔中 我發現有include這隻.h的都可以使用他 我不知道該怎麼解釋.. 問題二 繼承問題一,把static拿掉 compiler 不會過 是因為重複定義的關係嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.35.64.181
azureblaze:1.每個include他的c檔都會有獨立一個互不影響的This 02/07 20:55
azureblaze:雖然名稱一樣但是他們還是個別的東西 02/07 20:56
azureblaze:2. linker要求global中一個名稱只能定義一次 02/07 20:57
azureblaze:沒加static就是定義在global中 02/07 20:58
linotwo:#include "XXX.h" 就相當於把 XXX.h 的內容複製到該位置 02/07 21:18
linotwo:static int This; 如果寫在 .h 就等於被複製到每個 .c 裡 02/07 21:19
gg1122:所以global static 沒用到 亂include 會複製N份記憶體吧? 02/07 22:31
diabloevagto:不會,你會發生重複定義就發生錯誤了 02/07 22:40
mozzan:那請問問題二呢?? 我試過在.h寫 int this; 會過 02/07 23:19
mozzan:int this = 0; 就不會過了,然後static int this =0;又過了 02/07 23:20
tjjh89017:this不是保留字嗎? 02/07 23:26
linotwo:this 在 C++ 才是保留字。 02/07 23:30
tjjh89017:soga(筆記 02/07 23:32
linotwo:你加了 = 0 (初始化全域變數) 會讓實體在編譯期就確定了 02/07 23:44
linotwo:每個 .o (.obj) 變成有各自的實體,造成 linker error 02/07 23:46
gg1122:剛測試 跟一樓說的一樣 同變數名稱可是是不同的東西 02/08 00:17
gg1122:這樣還是只佔一份?@@ 有點奇怪... 02/08 00:19
makuro:剛好有翻到這個網站 可以參考看看 02/08 01:55
makuro:在Global時使用:更改變數scope 這一段 02/08 01:56
makuro:應該是佔兩份才對 如果是同一份的話 static就失去意義了 02/08 01:58
makuro:另外,mo大,不管我用int a=0 或是int a 都是重複定義 02/08 02:02
makuro:我不確定是不是因為我是用c++的緣故,能否請教一下 02/08 02:04
makuro:你是怎麼做到的@@?? 02/08 02:04
makuro:~~我可以噓我自己了,改成用c的話,mo大說的對, 02/08 02:10
makuro:如果用c++ ,就都會是重複定義 02/08 02:10
mozzan:lin大,未初始化的會擺在.bss區,初始化的在data區 02/08 12:12
mozzan:我現在知道問題二是因為在.data區重複定義了This 02/08 12:13
mozzan:所以.bss區不會產生這樣的問題是為什麼阿?? 02/08 12:14
linotwo:google : c common symbol 02/08 13:08