C++(5.5) const 和 static 成員

關(guān)于這條視頻里
?
19:22
?處在 Compiler Explorer 跑代碼翻車的解釋:
具體問題是,這段代碼能編譯通過,雖然 Foo::a 沒有被定義:

原因是,當(dāng)時(shí)編譯選項(xiàng)里有一個(gè) -O1,因此編譯器會(huì)做一些優(yōu)化。而在代碼里,我們使用 Foo::a 的唯一地方是 main 里用它初始化了 x;但是由于 x 后續(xù)沒有被使用,因此編譯器把 x 的定義優(yōu)化掉了,所以 Foo::a 就沒有被使用了,因此沒有報(bào)錯(cuò)。
具體來說,目前 C++ 編譯分為 9 個(gè)步驟,大概可以理解為 1~6 完成詞法分析,7~8 完成語法、語義分析和代碼生成,9 完成鏈接。我們期望的「找不到定義」的錯(cuò)誤是鏈接錯(cuò)誤,發(fā)生在第 9 階段;但由于在 7~8 階段中編譯器把 int x = Foo::a; 已經(jīng)優(yōu)化沒了,所以程序中沒有對(duì) Foo::a 的訪問了,因此沒有發(fā)生鏈接錯(cuò)誤。
如果用不會(huì)被優(yōu)化掉的方式訪問 Foo::a,我們就能看到預(yù)期的鏈接錯(cuò)誤:

上課的時(shí)候沒有看出來這個(gè)問題,抱歉QWQQQ
標(biāo)簽: