近年常被問到如何學習 C++

2005 年的時候曾經在 BBS 的全國轉信板 Programming 板上分享過 C++ 書籍的閱讀歷程,不過隨著時間流逝,那篇文章已經消失,但當年恰巧截了圖下來:

C++ 書籍閱讀歷程

或許有些老人曾經看過這東西,但隨著 C++11 的問世、侯捷淡出了繁體中文譯者圈、Scott Meyers 淡出 C++ 出版界,這些書大部分都已經過時且中譯版幾乎全部絕版,上面這張圖在 2022 年的今天也不再適用了。但我就是在這樣的學習環境裡長大的,所以我也無法在 2022 年提供一套新的 C++ 學習方式,畢竟當年的兩本磚頭聖經本 C++ 程式語言 (The C++ Programming Language) 以及 C++ Primer 即便換成了當今最新版本 The C++ Programming Language 4/e (中譯本) 及 C++ Primer 5/e (中譯本),也已經是接近過時的狀態,硬啃完這兩本對 C++ 的基礎知識也已經不完備了。坦白說,在 2011 年之後我也不知道該如何教一個新手如何學習 C++。所以很不好意思,我也幫不上忙,這只是一篇廢文。不過當年既然發了文,道義上我也得在這裡做一些說明。

Read more近年常被問到如何學習 C++

sequence point

這個名詞就算是國內做 compiler 的實驗室成員可能也未必聽過,畢竟國內沒什麼教授有種去帶領自己的團隊寫一套新的 compiler。
這原因除了短視近利等心理因素外,也還牽涉到不得不短視近利(或說隨波逐流)的民生問題
這個名詞其實也沒有那麼重要,原則上來說只要負責實作 compiler parser 部分的人懂就好了。
實作 compiler 但不負責寫 parser 的人不懂其實也無所謂,只是要做好被外面不懂 compiler 內部分工細節的人取笑的心理準備。

實務上沒有什麼人會真的去寫到非得注意這東西的程式碼,如果真的有的話他的同事會先讓他整個人黏在牆壁上
簡而言之這東西的用途除了跟 compiler 內部的最佳化機制有關外,在使用方面來說就單純只是測試 compiler 到底是否完全符合語言標準,
以及為了可憐一下那些初學程式設計的新手,而給他們一個可以依歸的準則罷了。
國內最容易讓人重新注意到這類問題的主要亂源,常常是不懂又亂出考題的學校老師和公司的面試官 (雖然我相信有很小一部份是真的故意出來考人)。
其次的亂源,就是自以為把程式寫到讓大家看不懂或容易看錯就代表很強的神經病

Read moresequence point

strict aliasing

今天剛好又遇到有人在問這個。
可能網路上能查到的資料太零散看規格書又查不到,很多人不清楚這東西是幹什麼的,
甚至還有一堆網頁列出了 x86 還是其它硬體架構的組語講了半天都講不到重點,所以還是在這簡單的做個說明好了。

Read morestrict aliasing

GCC 4.5 的 C++0x mode 還沒到堪用的程度

本文已作廢,心臟夠大顆的可以開了。

所以不要衝太快,
編大一點的程式遇到 list::sort(functor) 就炸了,
亂寫的範例:

Read moreGCC 4.5 的 C++0x mode 還沒到堪用的程度

續購 Enterprise Architect Corporate Edition

今天用 US$ 39 的價格續購了 Enterprise Architect Corporate Edition 的 Academic License,
基本上也是把學生證掃瞄給他們就可以了,
其實在蠻多國家要搞這個還得辦國際學生證,
但這家公司似乎掃了中文的他們看了也直接採信,
大概嫌麻煩或不差這個單一客戶吧,
另外他們的 sales 說要以教育授權續購的條件是必須在同一個教育單位,
換了的話好像就要重新買一次了。

Read more續購 Enterprise Architect Corporate Edition

藏在 UML 規格書中的重要範例

記得發現這東西的時候是剛把自己對 UML 的認識從 1.x upgrade 到 2.0 的時候,
除了讀讀相關的書籍之外,
也在實作過程中翻閱 UML 規格書來確認 classifiers 之間是否可以存在關聯,
當時在查閱 UML Superstructure specification 時,
特別注意到了它在 Interactions 一章中的某兩個範例,
是手邊的書中都沒有提過的。

Read more藏在 UML 規格書中的重要範例

用 Boost.Spirit 搭 std::string 使用時容易遇到的問題

這個問題太多人問了,
所以還是先寫下來當成 FAQ 用;
官方文件的 quick start 這一章是類似下面這樣教:

加上 The Scanner and Parsing 那一小節也提到 pharse-level parsing 有兩種版本:

導致有人寫出這種 code 來結果編不過在那邊哭:

Read more用 Boost.Spirit 搭 std::string 使用時容易遇到的問題

Boost.Serialization

在設計 editor、game 或是實現軟體系統中的 heuristic algorithm 等情況下,常需要設計 save/load 或 undo 之類的還原功能。學過 design pattern 的人大都知道 memento 和 command 這兩個 pattern。通常比較簡單的東西靠 command pattern 就能順便做出 undo 功能了,但是在其它比較複雜的狀況下就需要靠 memento pattern 來幫忙,將物件的狀態儲存起來以便隨時復原。有些語言如 Java 提供了將物件本身序列化 (serialize) 的機制,所謂序列化就是把物件狀態變成一串資料儲存起來。這樣就可以做到和 memento 相同的功能,更進一步的話還能將序列化後的資料存在 disk 上或透過網路傳遞。C++ 語言本身沒有支援 serialization 的功能,所以 boost 以 library support 的形式做了一個類似的。內建的支援有 binary、text 和 xml 三種輸出格式。這篇只會出現 text,反正用法都沒差 (唯一要注意的就是 binary 並非 portable)。

Read moreBoost.Serialization