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

作者: OoShiunoO (機機勳)   2017-04-14 20:03:04
如果說我有三個檔案
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是什麼時候要使用呢...?
作者: LPH66 (-6.2598534e+18f)   2017-04-14 20:29:00
你有試過把下面那種狀況的 a.o 和 c.o 連結起來嗎?
作者: steve1012 (steve)   2017-04-14 22:03:00
不是你想的這樣 你可以編譯看看
作者: Caesar08 (Caesar)   2017-04-15 01:12:00
下面會重複定義喔
作者: Bencrie   2017-04-15 02:06:00
不會啊
作者: chuegou (chuegou)   2017-04-15 02:41:00
下面不會重覆定義喔?所以c.c的x和b.h的x是分開的?
作者: LPH66 (-6.2598534e+18f)   2017-04-15 04:23:00
關於 c.c 的重覆定義問題, 我找到一個資料似乎表示在 C 裡int x; 是個 "tentative definition", 只在沒有其他定義時才會成為定義, 這跟 C++ 的 odr 是不一樣的http://tinyurl.com/mebmmvl所以原 PO 這裡大概也是因為這個原因c.c 裡的 int x = 1; 經由這個東西"漏出"到 a.c 裡去了OK, 既然有關鍵字就好找說明了:http://en.cppreference.com/w/c/language/extern在 C 裡在最上面寫 int x; 是和 extern 一樣具有外部連結性所以 a.c 的 x 是這一個有外部連結性的 xc.c 的 x 則因為 tentative definition 規則的關係取用到了 int x = 1; 這個 x (這時 int x; 對 c.c 沒用)於是在連結時 a.c 的外部連結性的 x 就連上 c.c 裡的這個了並不是什麼"漏出"的...
作者: FRAXIS (喔喔)   2017-04-15 08:00:00
但是下面的 a.c 和 c.c 分別 compile 時 不會各有一個 x ?
作者: Bencrie   2017-04-15 13:19:00
除非你給值或宣告 static

Links booklink

Contact Us: admin [ a t ] ucptt.com