→ loveme00835: 這樣寫其實是要方便記憶, extern 和 linkage type 息 05/02 00:41
→ loveme00835: 息相關, 書中已經提到 translation unit 的概念了嗎? 05/02 00:41
目前還沒看到
但有說之後章節會再重複提到這些概念
推 CoNsTaR: declaration 或 definition 不是由 extern 直接決定 05/02 05:13
→ CoNsTaR: 如果有 assignment 就是 definition,否則為 declaration 05/02 05:13
→ CoNsTaR: declaration 分配記憶體,definition 給值 05/02 05:13
→ CoNsTaR: 這裡會說 extern int i 是 declaration 單純是因為你不 05/02 05:13
→ CoNsTaR: 能在 extern 的同時 assign,既然沒有 assignment,所以 05/02 05:13
→ CoNsTaR: 是 declaration 05/02 05:13
→ CoNsTaR: int j 一樣是 declaration,因為沒有 assignment 05/02 05:13
→ CoNsTaR: int j = i 才算是 definition 05/02 05:13
感謝C大,說得很清楚!
※ 編輯: justhere (111.254.203.171 臺灣), 05/02/2020 08:57:19
→ loveme00835: 誰說 extern 就不能 assign 初始值? 講 extern 如果 05/02 10:21
→ loveme00835: 沒有講 linkage 那就不是正確的理解 05/02 10:21
→ justhere: 所以要先補後面的章節才比較完整嗎? 那我先略過這邊的 05/02 11:23
→ justhere: 疑問了 感謝以上大大的回答 05/02 11:24
推 ucrxzero: 樓上都錯 05/02 11:50
→ loveme00835: 加 extern 預設編譯器只會把名稱引進來, 多個 extern 05/02 12:36
→ loveme00835: 引進的名稱最後都會參考到同一個物件, 而這個物件可 05/02 12:38
→ loveme00835: 以在不同的程式碼檔 (translation unit) 裡定義, 但 05/02 12:40
→ loveme00835: 在編出來的 program 裡最多只允許一個. 加了 extern 05/02 12:44
→ loveme00835: 的 declaration 也可以透過明確初始化來提升為書裡講 05/02 12:44
→ loveme00835: 的定義, 也就是決定物件實體所在的位置. extern 只能 05/02 12:47
→ loveme00835: 拿來參考具有 external linkage 的物件, 如果你把 i 05/02 12:48
→ loveme00835: 的 decl 前方加上 static 那不給初始值的 extern 就 05/02 12:50
→ loveme00835: 沒用了 (如果每個地方都用 extern 而不去決定實體位 05/02 12:50
→ loveme00835: 置, 最後這個物件就不存在) 05/02 12:51
→ loveme00835: 其實 int j; 算是"宣告"並決定物件的初始値和位置, 05/02 13:07
→ loveme00835: 書裡把它說成"定義"是想和函式宣告作個區別 05/02 13:09
→ justhere: 書中在本小節有提到sperate compilation 感覺就是L大所 05/02 13:13
→ loveme00835: 等你學到 class static data member 的時候也可能被 05/02 13:13
→ justhere: 說的translation unit? 05/02 13:13
→ loveme00835: 書裡的這種分類給混淆 05/02 13:13
→ loveme00835: 對喔, 語言本身是設計可以分開編譯再連結執行的, 這 05/02 13:14
→ loveme00835: 時候物件的實體放在哪裡的這觀念就很重要, extern 基 05/02 13:15
→ loveme00835: 本上就是設計來跨 translation unit 參考 05/02 13:15
→ protoss: 我一直以為int j;其實已經算定義了? 05/02 19:08
→ stucode: 根據標準 int j; 是定義沒錯。 05/02 19:47
→ loveme00835: 嚴格來說不是語法決定定義與否, 而是由情境來決定 05/02 20:26
→ loveme00835: 宣告就是宣告, 但某些情境下宣告即定義 05/02 20:27
→ eye5002003: 其實include就是將標頭檔的內容給複製貼上,明白這點 05/07 12:27
→ eye5002003: 就可以想通很多問題了,也很自然的理解extern了 05/07 12:28