Google C++代碼規範:頭文件

2021-02-20 天空的代碼世界
好的規範還是需要學習一下。

一、背景

最近在閱讀 Google C++ 代碼規範,常用的整理出來,分享給大家。

閱讀的相關規範主要是 Google C++ Style Guide。

作為第一篇,先分享一下頭文件規範。

二、頭文件

通常,每一個 .cc 文件都有一個對應的 .h 文件。
也有一些常見例外,如單元測試和只包含 main() 函數的小型 .cc 文件。

正確使用頭文件可令代碼在可讀性、文件大小和性能上大為改觀。

三、Self-contained 頭文件

頭文件應該是自給自足( self-contained,可自編譯),以 .h 結尾。
禁止分離出 -inl.h 頭文件的做法。

自給自足的意思是用戶和重構工具不需要為特別場合而包含額外的頭文件和符號(symbols)。

四、頭文件保護

所有頭文件都應該使用 #define 或 #pragma once 來防止頭文件被多重包含。

其中 #define 的命名格式當是 :  <PROJECT>_<PATH>_<FILE>_H_

使用 cpplint 工具來檢查頭文件保護,如果不符合要求,會有下面兩種錯誤提示:

#ifndef header guard has wrong style, please use: <PROJECT>_<PATH>_<FILE>_H_ [build/header_guard]cpplint

#endif line should be "#endif // <PROJECT>_<PATH>_<FILE>_H_ [build/header_guard]cpplint

五、前置聲明

儘可能地避免使用前置聲明。

使用 #include 包含需要的頭文件。

定義:前置聲明(forward declaration)是類、函數和模板的純粹聲明,沒伴隨著其定義。

優點:節省編譯時間。

缺點:隱藏依賴關係,依賴升級可能會不兼容甚至引入某些 BUG。

例如對函數進行聲明,後來加了一個參數,就會導致找不到函數。
如果對類進行聲明,類進行調整時,甚至可能導致類的內存錯誤。

六、內聯函數

只有當函數只有 10 行甚至更少時才將其定義為內聯函數。

定義:當函數被聲明為內聯函數之後,編譯器會將其內聯展開,而不是按通常的函數調用機制進行調用。

優點:內聯函數較小時,可以使代碼性能更高(少一次函數調用)。

缺點:濫用內聯函數導致程序變慢。

注意實現:遞歸和虛函數不能使用內聯。

七、 include 的路徑及順序

標準的頭文件包含順序可增強可讀性,避免隱藏依賴。

要求頭文件順序為:相關頭文件、C 庫、C++ 庫、其他庫的 .h、本項目內的 .h。

項目內頭文件應按照項目原始碼目錄樹結構排列,避免使用 UNIX 特殊的快捷目錄. (當前目錄) 或 .. (上級目錄)。

例如 dir/foo.cc 或 dir/foo_test.cc 的主要作用是實現或測試 dir2/foo2.h 的功能,foo.cc 中包含頭文件的次序如下:

1. dir2/foo2.h(優先位置,詳情如下)

2. 空行

3. C 系統頭文件

4. 空行

5. C++ 標準庫頭文件

6. 空行

7. 其他庫的 `.h`文件

8. (可選)空行

9. 本項目內 `.h`文件

八、最後

回顧一下,對於頭文件的規範,細分為五個子規範,分別是 Self-contained 頭文件、頭文件保護、前置聲明、內聯函數、include 的路徑及順序。

如果你想查看 Google C++ Style 原文文檔,可以點擊這裡:https://google.github.io/styleguide/cppguide.html

當然,你也可以點擊左下角的原文閱讀來快速到達。

《完》

-EOF-

題圖:來自朋友圈。

上篇文章:2020 騰訊程序設計競賽(二)

推薦:學習 c++11 之各種小技巧

長按二維碼,一起成長學習

▲ 長按關注,天天成長

覺得有幫助可以點擊好看與轉發,謝謝!

相關焦點

  • 閱讀Google的C++代碼規範有感
    最近花了點時間看了下這份代碼規範,收穫確實很大,在編程過程中一些亂七八糟的壞習慣也該改一改了。最新的英文版見http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml,2009年有人翻譯的一份見http://ishare.iask.sina.com.cn/f/19210212.html?
  • Google C++項目編程風格指南 (中文版) 分享
    去年很火的「代碼不規範,親人兩行淚」 事件,想必大家都懂的,代碼不規範確實會給後來維護者帶來巨大的麻煩,有個朋友說:看本人代碼的感覺就跟吃屎一樣雖然不是很懂屎的味道,但是應該是很難吃吧,我也不敢問,也不敢說。因此今天分享一下Google開源的編程風格指南。
  • 《Google的Java編碼規範》(Google Java Style)在線地址
    Google最近發布了一份完整的Java編碼規範。規範的內容包括一些切實可行的硬性規定。Google內部均遵守此規範。該規範不僅涵蓋了代碼格式,還包括其他類型的約定和編碼標準。 Google最近發布了一份完整的Java編碼規範。規範的內容包括一些切實可行的硬性規定。
  • 代碼為什麼需要遵循規範,來看看µC/OS代碼規範
    開發過項目的工程師都知道,一個好的項目,代碼基本都有統一的規範,否則代碼就會隨著版本迭代,變得越來越臃腫。
  • Android 代碼規範文檔
    這個時候問題來了,如何讓代碼不分你我,或許只需要一套規則,你和我都認可並且遵守的代碼規範守則。那麼你的疑問可能又來了,怎麼樣才能算好的代碼規範,答案只有一個,真正好的代碼規範就是別人的代碼你一眼就能看懂,更不需要反覆去看。
  • c++的輸入與輸出
    c++輸入與輸出C++ 標準庫提供了一組豐富的輸入/輸出功能,本章將討論 C++ 編程中最基本和最常見的 I/O 操作。輸入輸出並不是c++語言的正式組成成分,c和c++沒有為輸入輸出提供專門的結構。在c語言中輸入輸出是通過調用scanf和printf 實現的,在c++中是通過調用流對象cin和cout實現的。
  • 學習c++筆記——標準輸出流cout
    c++語言標準輸出流cout是啥?」。我答:「就是在列印設備或顯示設備上輸出息信」 。女粉絲問:「陳老師,可以教我嗎。」。我答:「好的~!」,下面我就教大家c++語言中cout的用法,c++語言1是一個很cout輸出案例,下面我們就一步一步講解下這個套代碼。
  • 解決JAVA調用C++ DLL文件Unable to load library的問題
    JNI:Java Native Interface是Java平臺的一部分,可用於讓Java和其他語言編寫的代碼進行交互,不過JNI調用過程相當的麻煩。JNI調用示例代碼:確認調用文件的運行環境,確認DLL文件運行的c++ runtime library版本,確認電腦是否已經安裝。二. 確認Native.loadLibrary調用的DLL文件路徑是否正確,儘量寫完整路徑,有時候寫相對路徑會有問題。
  • C++機器學習庫介紹
    依靠這些庫,我們的學習能力和編寫代碼,無論是在C++或Python,都是如此的簡單和直觀。C++中的機器學習庫在本節中,我們將介紹C+中兩個最流行的機器學習庫:SHARK庫MLPACK庫讓我們逐一查看並查看他們的C++代碼。
  • C 語言會比 C++ 快?
    這是在具有 100K 行的代碼庫上, 而我們的算法只有 1K 行代碼(當然我們的代碼中不包括 STL 雖然排除 STL 並不完全公平,但是加入 STL 計算代碼行也不完全公平,因為我們知道我們的算法完全可以在沒有任何 STL 依賴的情況下用 1K 行代碼來實現)。在編譯代碼時你會注意到 400 毫秒,即使它只有一個文件。
  • python+C、C++混合編程的應用
    混合編程的原理首先要說一下python只是一個語言規範,實際上python有很多實現:CPython是標準Python,是由C編寫的,python腳本被編譯成CPython字節碼,然後由虛擬機解釋執行,垃圾回收使用引用計數,我們談與C/C++混合編程實際指的是基於CPython解釋上的。
  • 濤哥講事-新手教程5-C++語句學習之賦值和輸入輸出語句
    最近有點事,濤哥沒有來得及更新教程,今天給大家說一下代碼中的語句。前面大家也看到了,我們的代碼是由很多語句組成的,但是我們寫各種語句都是有規範的,到底有哪些語句,怎麼寫這些語句去解決具體的事情呢。今天我們就先看看兩種最基本的語句:賦值語句和輸入輸出語句。
  • C++基礎總結(一):從「hello world」入門C++!
    面向對象程序設計c++最大的亮點就是面向對象程序設計理念的運用。包括面向對象開發的四大特性:封裝;抽象;繼承;多態C++的組成部分標準的 C++ 由三個重要部分組成:核心語言,提供了所有構件塊,包括變量、數據類型和常量,等等。
  • 為什麼應該用模塊取代C/C++中的頭文件?
    為什麼應該使用模塊(Module)替代頭文件(Header)?頭文件糟透了!眾所周知,C程序在編譯時一般會預處理頭文件:另外,頭文件形式的可擴展性天生不足。假設有n個源文件,每個源文件引用了m個頭文件,那麼構建過程的開銷會是m×n。這在C++中表現得尤為糟糕。所以預說處理頭文件是一個非常糟糕的解決方案。
  • Python代碼規範——注釋和命名規範
    這邊有幾個需要注意的點,在代碼的關鍵部分(或比較複雜的部分),能寫注釋的儘量寫注釋,而比較重要的幾個注釋段,要使用多個等號隔開,讓這個注釋更加醒目,突出重要性。我們來看看google的docstring風格示例:"""Example docstrings.This module demonstrates documentation as specified by the `Google PythonStyle Guide`_.
  • C++ 的幾個for 循環,範圍for語句
    不過,我們可以通過學習C++的知識,來掌握面向對象的編程思想,有了這樣的思想後,再去看代碼或者去做自己的項目,是非常有幫助的。這個號是我的僚機號,會發一些大號發不了、或者沒有檔期發的內容,歡迎大家關注。
  • C語言的頭文件包含竟然有那麼多講究!
    《google C++ Style Guide》 1.2 頭文件依賴 章節也給出了類似的闡述:若包含了頭文件aa.h,則就引入了新的依賴:一旦aa.h被修改,任何直接和間接包含aa.h代碼都會被重新編譯。如果aa.h又包含了其他頭文件如bb.h,那麼bb.h的任何改變都將導致所有包含了aa.h的代碼被重新編譯。
  • C++ 的門門道道 | 技術頭條 - CSDN
    Rule:C++在不同模塊(源文件)裡定義的全局變量,不保證構造順序;但保證在同一模塊(源文件)裡定義的全局變量,按定義的先後順序構造,按定義的相反次序析構。= nullptr && ptr->Do())這樣的代碼,這正是利用了操作符短路的語法特徵。
  • c++簡介及順序結構
    3.2. 新建源程序 保存、編譯、運行程序保存上面的代碼,得到的文件叫源程序,以cpp作為後綴名把源程序翻譯成二進位形式的目標文件,叫做編譯把目標文件和系統庫文件等信息連接起來形成可執行文件,後綴名為exe,運行的就是可執行文件。4. cout語句4.1.
  • 「最佳實踐」C++陷阱與套路
    Rule:C++在不同模塊(源文件)裡定義的全局變量,不保證構造順序;但保證在同一模塊(源文件)裡定義的全局變量,按定義的先後順序構造,按定義的相反次序析構。= nullptr && ptr->Do())這樣的代碼,這正是利用了操作符短路的語法特徵。