[問題] initializer 的具體作用

看板C_and_CPP作者 (發廢文就是生活的小確幸)時間4年前 (2020/05/01 23:54), 4年前編輯推噓2(2039)
留言41則, 7人參與, 4年前最新討論串1/2 (看更多)
各位好,小弟新手, 目前在看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

05/02 00:41, 4年前 , 1F
這樣寫其實是要方便記憶, extern 和 linkage type 息
05/02 00:41, 1F

05/02 00:41, 4年前 , 2F
息相關, 書中已經提到 translation unit 的概念了嗎?
05/02 00:41, 2F
目前還沒看到 但有說之後章節會再重複提到這些概念

05/02 05:13, 4年前 , 3F
declaration 或 definition 不是由 extern 直接決定
05/02 05:13, 3F

05/02 05:13, 4年前 , 4F
如果有 assignment 就是 definition,否則為 declaration
05/02 05:13, 4F

05/02 05:13, 4年前 , 5F
declaration 分配記憶體,definition 給值
05/02 05:13, 5F

05/02 05:13, 4年前 , 6F
這裡會說 extern int i 是 declaration 單純是因為你不
05/02 05:13, 6F

05/02 05:13, 4年前 , 7F
能在 extern 的同時 assign,既然沒有 assignment,所以
05/02 05:13, 7F

05/02 05:13, 4年前 , 8F
是 declaration
05/02 05:13, 8F

05/02 05:13, 4年前 , 9F
int j 一樣是 declaration,因為沒有 assignment
05/02 05:13, 9F

05/02 05:13, 4年前 , 10F
int j = i 才算是 definition
05/02 05:13, 10F
感謝C大,說得很清楚! ※ 編輯: justhere (111.254.203.171 臺灣), 05/02/2020 08:57:19

05/02 10:21, 4年前 , 11F
誰說 extern 就不能 assign 初始值? 講 extern 如果
05/02 10:21, 11F

05/02 10:21, 4年前 , 12F
沒有講 linkage 那就不是正確的理解
05/02 10:21, 12F

05/02 11:23, 4年前 , 13F
所以要先補後面的章節才比較完整嗎? 那我先略過這邊的
05/02 11:23, 13F

05/02 11:24, 4年前 , 14F
疑問了 感謝以上大大的回答
05/02 11:24, 14F

05/02 11:50, 4年前 , 15F
樓上都錯
05/02 11:50, 15F

05/02 12:36, 4年前 , 16F
加 extern 預設編譯器只會把名稱引進來, 多個 extern
05/02 12:36, 16F

05/02 12:38, 4年前 , 17F
引進的名稱最後都會參考到同一個物件, 而這個物件可
05/02 12:38, 17F

05/02 12:40, 4年前 , 18F
以在不同的程式碼檔 (translation unit) 裡定義, 但
05/02 12:40, 18F

05/02 12:44, 4年前 , 19F
在編出來的 program 裡最多只允許一個. 加了 extern
05/02 12:44, 19F

05/02 12:44, 4年前 , 20F
的 declaration 也可以透過明確初始化來提升為書裡講
05/02 12:44, 20F

05/02 12:47, 4年前 , 21F
的定義, 也就是決定物件實體所在的位置. extern 只能
05/02 12:47, 21F

05/02 12:48, 4年前 , 22F
拿來參考具有 external linkage 的物件, 如果你把 i
05/02 12:48, 22F

05/02 12:50, 4年前 , 23F
的 decl 前方加上 static 那不給初始值的 extern 就
05/02 12:50, 23F

05/02 12:50, 4年前 , 24F
沒用了 (如果每個地方都用 extern 而不去決定實體位
05/02 12:50, 24F

05/02 12:51, 4年前 , 25F
置, 最後這個物件就不存在)
05/02 12:51, 25F

05/02 13:07, 4年前 , 26F
其實 int j; 算是"宣告"並決定物件的初始値和位置,
05/02 13:07, 26F

05/02 13:09, 4年前 , 27F
書裡把它說成"定義"是想和函式宣告作個區別
05/02 13:09, 27F

05/02 13:13, 4年前 , 28F
書中在本小節有提到sperate compilation 感覺就是L大所
05/02 13:13, 28F

05/02 13:13, 4年前 , 29F
等你學到 class static data member 的時候也可能被
05/02 13:13, 29F

05/02 13:13, 4年前 , 30F
說的translation unit?
05/02 13:13, 30F

05/02 13:13, 4年前 , 31F
書裡的這種分類給混淆
05/02 13:13, 31F

05/02 13:14, 4年前 , 32F
對喔, 語言本身是設計可以分開編譯再連結執行的, 這
05/02 13:14, 32F

05/02 13:15, 4年前 , 33F
時候物件的實體放在哪裡的這觀念就很重要, extern 基
05/02 13:15, 33F

05/02 13:15, 4年前 , 34F
本上就是設計來跨 translation unit 參考
05/02 13:15, 34F

05/02 19:08, 4年前 , 35F
我一直以為int j;其實已經算定義了?
05/02 19:08, 35F

05/02 19:47, 4年前 , 36F
根據標準 int j; 是定義沒錯。
05/02 19:47, 36F

05/02 19:47, 4年前 , 37F

05/02 20:26, 4年前 , 38F
嚴格來說不是語法決定定義與否, 而是由情境來決定
05/02 20:26, 38F

05/02 20:27, 4年前 , 39F
宣告就是宣告, 但某些情境下宣告即定義
05/02 20:27, 39F

05/07 12:27, 4年前 , 40F
其實include就是將標頭檔的內容給複製貼上,明白這點
05/07 12:27, 40F

05/07 12:28, 4年前 , 41F
就可以想通很多問題了,也很自然的理解extern了
05/07 12:28, 41F
文章代碼(AID): #1Uh4OQCT (C_and_CPP)
文章代碼(AID): #1Uh4OQCT (C_and_CPP)