關於 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 裡的這個了並不是什麼"漏出"的...