关于 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 里的这个了并不是什么"漏出"的...