作者OoShiunoO (机机勳)
看板C_and_CPP
标题[问题] 一直都看不懂extern是干嘛的
时间Fri Apr 14 20:03:04 2017
如果说我有三个档案
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1492171387.A.CE9.html
1F:推 LPH66: 你有试过把下面那种状况的 a.o 和 c.o 连结起来吗? 04/14 20:29
2F:推 steve1012: 不是你想的这样 你可以编译看看 04/14 22:03
3F:→ Caesar08: 下面会重复定义喔 04/15 01:12
4F:推 Bencrie: 不会啊 04/15 02:06
5F:推 chuegou: 下面不会重覆定义喔?所以c.c的x和b.h的x是分开的? 04/15 02:41
6F:推 LPH66: 关於 c.c 的重覆定义问题, 我找到一个资料似乎表示在 C 里 04/15 04:23
7F:→ LPH66: int x; 是个 "tentative definition", 只在没有其他定义时 04/15 04:24
8F:→ LPH66: 才会成为定义, 这跟 C++ 的 odr 是不一样的 04/15 04:24
10F:→ LPH66: 所以原 PO 这里大概也是因为这个原因 04/15 04:25
11F:→ LPH66: c.c 里的 int x = 1; 经由这个东西"漏出"到 a.c 里去了 04/15 04:26
12F:→ LPH66: OK, 既然有关键字就好找说明了: 04/15 04:31
14F:→ LPH66: 在 C 里在最上面写 int x; 是和 extern 一样具有外部连结性 04/15 04:31
15F:→ LPH66: 所以 a.c 的 x 是这一个有外部连结性的 x 04/15 04:32
16F:→ LPH66: c.c 的 x 则因为 tentative definition 规则的关系 04/15 04:32
17F:→ LPH66: 取用到了 int x = 1; 这个 x (这时 int x; 对 c.c 没用) 04/15 04:33
18F:→ LPH66: 於是在连结时 a.c 的外部连结性的 x 就连上 c.c 里的这个了 04/15 04:33
19F:→ LPH66: 并不是什麽"漏出"的... 04/15 04:33
20F:推 FRAXIS: 但是下面的 a.c 和 c.c 分别 compile 时 不会各有一个 x ? 04/15 08:00
21F:推 Bencrie: 除非你给值或宣告 static 04/15 13:19