[問題] static 問題

看板C_and_CPP (C/C++)作者 (mozzan)時間13年前 (2013/02/07 20:29), 編輯推噓3(3027)
留言30則, 7人參與, 最新討論串1/1
請問大家有關static 的問題 問題一 假設現在有個宣告 static int This = 0; 我看書上寫的是如果在.c檔中做這樣的宣告(全域), 只有在該.c檔可以使用他 那現在問題來了 我今天把他寫在.h檔中 我發現有include這隻.h的都可以使用他 我不知道該怎麼解釋.. 問題二 繼承問題一,把static拿掉 compiler 不會過 是因為重複定義的關係嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.35.64.181

02/07 20:55, , 1F
1.每個include他的c檔都會有獨立一個互不影響的This
02/07 20:55, 1F

02/07 20:56, , 2F
雖然名稱一樣但是他們還是個別的東西
02/07 20:56, 2F

02/07 20:57, , 3F
2. linker要求global中一個名稱只能定義一次
02/07 20:57, 3F

02/07 20:58, , 4F
沒加static就是定義在global中
02/07 20:58, 4F

02/07 21:18, , 5F
#include "XXX.h" 就相當於把 XXX.h 的內容複製到該位置
02/07 21:18, 5F

02/07 21:19, , 6F
static int This; 如果寫在 .h 就等於被複製到每個 .c 裡
02/07 21:19, 6F

02/07 22:31, , 7F
所以global static 沒用到 亂include 會複製N份記憶體吧?
02/07 22:31, 7F

02/07 22:40, , 8F
不會,你會發生重複定義就發生錯誤了
02/07 22:40, 8F

02/07 23:19, , 9F
那請問問題二呢?? 我試過在.h寫 int this; 會過
02/07 23:19, 9F

02/07 23:20, , 10F
int this = 0; 就不會過了,然後static int this =0;又過了
02/07 23:20, 10F

02/07 23:26, , 11F
this不是保留字嗎?
02/07 23:26, 11F

02/07 23:30, , 12F
this 在 C++ 才是保留字。
02/07 23:30, 12F

02/07 23:32, , 13F
soga(筆記
02/07 23:32, 13F

02/07 23:44, , 14F
你加了 = 0 (初始化全域變數) 會讓實體在編譯期就確定了
02/07 23:44, 14F

02/07 23:46, , 15F
每個 .o (.obj) 變成有各自的實體,造成 linker error
02/07 23:46, 15F

02/08 00:17, , 16F
剛測試 跟一樓說的一樣 同變數名稱可是是不同的東西
02/08 00:17, 16F

02/08 00:19, , 17F
這樣還是只佔一份?@@ 有點奇怪...
02/08 00:19, 17F

02/08 01:55, , 18F
剛好有翻到這個網站 可以參考看看
02/08 01:55, 18F

02/08 01:56, , 20F
在Global時使用:更改變數scope 這一段
02/08 01:56, 20F

02/08 01:58, , 21F
應該是佔兩份才對 如果是同一份的話 static就失去意義了
02/08 01:58, 21F

02/08 02:02, , 22F
另外,mo大,不管我用int a=0 或是int a 都是重複定義
02/08 02:02, 22F

02/08 02:04, , 23F
我不確定是不是因為我是用c++的緣故,能否請教一下
02/08 02:04, 23F

02/08 02:04, , 24F
你是怎麼做到的@@??
02/08 02:04, 24F

02/08 02:10, , 25F
~~我可以噓我自己了,改成用c的話,mo大說的對,
02/08 02:10, 25F

02/08 02:10, , 26F
如果用c++ ,就都會是重複定義
02/08 02:10, 26F

02/08 12:12, , 27F
lin大,未初始化的會擺在.bss區,初始化的在data區
02/08 12:12, 27F

02/08 12:13, , 28F
我現在知道問題二是因為在.data區重複定義了This
02/08 12:13, 28F

02/08 12:14, , 29F
所以.bss區不會產生這樣的問題是為什麼阿??
02/08 12:14, 29F

02/08 13:08, , 30F
google : c common symbol
02/08 13:08, 30F
文章代碼(AID): #1H4vuqub (C_and_CPP)
文章代碼(AID): #1H4vuqub (C_and_CPP)