「C Core Guidelines」是在 CppCon 2015 這個 C 的 conderence(官網)被提出來的,這個專案目前還在發展中,它的內容都放在 https://github.com/isocpp/CppCoreGuidelines 裡。
這個「Guidelines Prohect」的主要目的,是希望可以盡量針對問題,提出好的答案、讓大家可以參考、更有效率地寫出更好的 C 程式。
而最主要的介紹,應該是可以參考 Bjarne Stroustrup(C 之父、維基百科)的《Writing good C 14》(投影片、YouTube)這份簡報。其他在 talks 資料夾(連結)中,也有其他的投影片,在 docs 資料夾(連結)中,目前則有兩份文件。
在投影片的最後面,也有寫出他的設計哲理(philosophy),那就是:
- 針對困難的問題(Attack hard problems)
- 像是資源管理(resource)、介面(interface)、邊界(bound)問題等等。
- 指示性的(Be prescriptive)
- 因為「不要那樣做」類型的規則,其實不是很有幫助。
- 提供解釋 
- 只是「因為我說這樣」(because I say so)很沒有幫助。
- 提供機器可以檢查的規則(machine-checkable rules)
- 機器是系統性的、快速、而且不會覺得無聊。
- 不限制一般性(Don’t limit generality)
- 不在效能方面妥協
- 超集的子集(Subset of superset)
在 Core Guidelines 裡面,會有高階規則(High-level rules)、主要是給人看的,也會是這份 guideline 主要的目標;另外也會有低階規則(Lower-level rules)、主要是給工具參考的。
右圖就是一個使用 C 的概念。可以看到,C 的部分,被分為兩部分,一部分在紅線之下、被標記成不要用(Don’t Use)。
而另一部分則是在紅線之上、和 STL 以及 GSL 有所重疊,是一般會去使用的部分;這也就是上面所說的,「Subset of superset」的部分了。
其中,「GSL」是指新的「guidelines support library」這個小型的跨平台、跨編譯器的函式庫,目前微軟已經有提供可以使用的實作了(GitHub);他主要是提供一些簡單的型別,來讓 C 程式的開發者可以更簡單地寫出符合 Core Guidelines 的程式。
而在圖中下面被標示成不要用的部分,實際上並非真的不需要,而是被用來實作相對高階的功能;但是實際上在一般使用的時候,可以直接使用較高階的功能、介面。
而在 Core Rules 中,最重要的核心則是三項:
- No leaks(沒有資源的漏出、洩漏)
- No dangling pointers(避免迷途指標,指的是指向不存在的空間的指標、維基百科)
- No type violations through pointers(沒有透過指標造成的型別存取違規)
這幾點,主要都是針對 C 的指標(pointer)這個最容易出問題的設計而來的。在投影片中,也有針對這些問題,做了許多說明。而實際上,為了解決這個問題,其實在 C 11 的標準函式庫裡面,已經提供了「Smart Pointer」這個類別、在一定程度上可以避免出問題;而在 GSL 中,則是又提供基本上沒有 cost 的 owner<> 這類的東西、來提供一個更輕量化的輔助方案。
目前號稱已經有 350 條規則了,但是說實話,Heresy 不知道到底要怎麼看?
不過,在投影片裡面也有說,基本上這份 guildline 不太可能全部記得、也不需要全部的規則,大概也永遠不會全不知道…而在真的開始寫程式之前,應該也不可能全部學會。
所以,基本上,應該就是當參考用吧~
Heresy 之後應該會試著把《Writing good C 14》這份投影片裡的比較技術性、和 GSL 有關的部分在認真看看,然後再整理一下了。