看板 C_and_CPP 關於我們 聯絡資訊
各位好,小弟新手, 目前在看C++ primier fifth edition, 進度到variable的定義與宣告這個小節, 在講extern 這個keyword時書中舉一個小範例: extern int i; // declares but does not define i int j; // declares and defines i 他解釋 To obtain a declaration that is not also a definition, we add extern keyword and may not provide an explicit initializer 請問具體來說c++中initializer所做的事情是什麼呢? 是分配記憶體位置和值給該name嗎? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.198.63 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1588348442.A.31D.html
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
stucode: https://eel.is/c++draft/basic.def#2 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