C++ Core Guidelines


「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 有關的部分在認真看看,然後再整理一下了。

對「C++ Core Guidelines」的想法

  1. 別忘了還有Herb Sutter的《Writing Good C++14… By Default》!

    以我理解,這些Guidelines不必逐條閱讀。平時寫程式本來就該善用Standard Library,不要pointer亂丟,做好const correctness等等,這些其實沒有改變。真的犯規了,compiler或static analyzer就會告訴我們該讀哪條。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.