[问题] 一直都看不懂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