[問題] initializer 的具體作用

作者: justhere (發廢文就是生活的小確幸)   2020-05-01 23:54:00
各位好,小弟新手,
目前在看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嗎?
感謝
作者: loveme00835 (髮箍)   2020-05-02 00:41:00
這樣寫其實是要方便記憶, extern 和 linkage type 息息相關, 書中已經提到 translation unit 的概念了嗎?
作者: CoNsTaR ((const *))   2020-05-02 05:13:00
declaration 或 definition 不是由 extern 直接決定如果有 assignment 就是 definition,否則為 declarationdeclaration 分配記憶體,definition 給值這裡會說 extern int i 是 declaration 單純是因為你不能在 extern 的同時 assign,既然沒有 assignment,所以是 declarationint j 一樣是 declaration,因為沒有 assignmentint j = i 才算是 definition
作者: loveme00835 (髮箍)   2020-05-02 10:21:00
誰說 extern 就不能 assign 初始值? 講 extern 如果沒有講 linkage 那就不是正確的理解
作者: justhere (發廢文就是生活的小確幸)   2020-05-02 11:23:00
所以要先補後面的章節才比較完整嗎? 那我先略過這邊的疑問了 感謝以上大大的回答
作者: ucrxzero (RX-0)   2020-05-02 11:50:00
樓上都錯
作者: loveme00835 (髮箍)   2020-05-02 12:36:00
加 extern 預設編譯器只會把名稱引進來, 多個 extern引進的名稱最後都會參考到同一個物件, 而這個物件可以在不同的程式碼檔 (translation unit) 裡定義, 但在編出來的 program 裡最多只允許一個. 加了 extern的 declaration 也可以透過明確初始化來提升為書裡講的定義, 也就是決定物件實體所在的位置. extern 只能拿來參考具有 external linkage 的物件, 如果你把 i的 decl 前方加上 static 那不給初始值的 extern 就沒用了 (如果每個地方都用 extern 而不去決定實體位置, 最後這個物件就不存在)其實 int j; 算是"宣告"並決定物件的初始値和位置,書裡把它說成"定義"是想和函式宣告作個區別
作者: justhere (發廢文就是生活的小確幸)   2020-05-02 13:13:00
書中在本小節有提到sperate compilation 感覺就是L大所
作者: loveme00835 (髮箍)   2020-05-02 13:13:00
等你學到 class static data member 的時候也可能被
作者: protoss (天生散人)   2020-05-02 19:08:00
我一直以為int j;其實已經算定義了?
作者: stucode   2020-05-02 19:47:00
根據標準 int j; 是定義沒錯。https://eel.is/c++draft/basic.def#2
作者: loveme00835 (髮箍)   2020-05-02 20:26:00
嚴格來說不是語法決定定義與否, 而是由情境來決定宣告就是宣告, 但某些情境下宣告即定義
作者: eye5002003 (下一夜)   2020-05-07 12:27:00
其實include就是將標頭檔的內容給複製貼上,明白這點就可以想通很多問題了,也很自然的理解extern了

Links booklink

Contact Us: admin [ a t ] ucptt.com