[問題] 一直都看不懂extern是幹嘛的

看板C_and_CPP (C/C++)作者 (機機勳)時間9年前 (2017/04/14 20:03), 編輯推噓7(7014)
留言21則, 6人參與, 最新討論串1/1
如果說我有三個檔案 a.c b.h c.c #include "b.h" 空的 #include "b.h" int main(){ int x=1; extern x; printf("%d",x); } a.c b.h c.c #include "b.h" int x; #include "b.h" int main(){ int x=1; printf("%d",x); } 請問上面和下面的差別在哪呢?如果我用下面那種,把全域變數都在h檔宣告 這樣就不需要extern了,那麼到底extern是什麼時候要使用呢...? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.168.149.225 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1492171387.A.CE9.html

04/14 20:29, , 1F
你有試過把下面那種狀況的 a.o 和 c.o 連結起來嗎?
04/14 20:29, 1F

04/14 22:03, , 2F
不是你想的這樣 你可以編譯看看
04/14 22:03, 2F

04/15 01:12, , 3F
下面會重複定義喔
04/15 01:12, 3F

04/15 02:06, , 4F
不會啊
04/15 02:06, 4F

04/15 02:41, , 5F
下面不會重覆定義喔?所以c.c的x和b.h的x是分開的?
04/15 02:41, 5F

04/15 04:23, , 6F
關於 c.c 的重覆定義問題, 我找到一個資料似乎表示在 C 裡
04/15 04:23, 6F

04/15 04:24, , 7F
int x; 是個 "tentative definition", 只在沒有其他定義時
04/15 04:24, 7F

04/15 04:24, , 8F
才會成為定義, 這跟 C++ 的 odr 是不一樣的
04/15 04:24, 8F

04/15 04:25, , 9F

04/15 04:25, , 10F
所以原 PO 這裡大概也是因為這個原因
04/15 04:25, 10F

04/15 04:26, , 11F
c.c 裡的 int x = 1; 經由這個東西"漏出"到 a.c 裡去了
04/15 04:26, 11F

04/15 04:31, , 12F
OK, 既然有關鍵字就好找說明了:
04/15 04:31, 12F

04/15 04:31, , 13F

04/15 04:31, , 14F
在 C 裡在最上面寫 int x; 是和 extern 一樣具有外部連結性
04/15 04:31, 14F

04/15 04:32, , 15F
所以 a.c 的 x 是這一個有外部連結性的 x
04/15 04:32, 15F

04/15 04:32, , 16F
c.c 的 x 則因為 tentative definition 規則的關係
04/15 04:32, 16F

04/15 04:33, , 17F
取用到了 int x = 1; 這個 x (這時 int x; 對 c.c 沒用)
04/15 04:33, 17F

04/15 04:33, , 18F
於是在連結時 a.c 的外部連結性的 x 就連上 c.c 裡的這個了
04/15 04:33, 18F

04/15 04:33, , 19F
並不是什麼"漏出"的...
04/15 04:33, 19F

04/15 08:00, , 20F
但是下面的 a.c 和 c.c 分別 compile 時 不會各有一個 x ?
04/15 08:00, 20F

04/15 13:19, , 21F
除非你給值或宣告 static
04/15 13:19, 21F
文章代碼(AID): #1OyBfxpf (C_and_CPP)
文章代碼(AID): #1OyBfxpf (C_and_CPP)