天天看點

C++程式設計規範和标準總結

  • 檔案名:
    • 每個源代碼檔案應該有一個包含檔案。每個包含檔案描述了單個類或者多個類相結合的集合。一般頭檔案(.h,或.hpp)包含類的定義而不是執行個體。是以包含檔案可以用在多個檔案當中,源檔案(.c,.或cpp)定義了編譯時加載進記憶體的代碼,它的執行個體化定義包含在頭檔案中,例如,一個類的定義應該包含在.hpp的包含檔案中,一個全局變量應該在.cpp檔案中執行個體化而不是.hpp檔案中。用extern在頭檔案聲明該全局變量。
    • 檔案名應該能夠反映出類名。通常類名都是大寫字母開頭,頭檔案名和源檔案名一般用小寫字母開頭,如檔案classBase.hpp将包含ClassBase{}的定義,classBase.cpp将包含該類函數的源代碼。
    • 類名建議使用下面的格式命名: CXxClassID, 其中 "Xx" 指的是類的構件. (如. Mn-- main, Fm-- File manager, Cp --command processor) 每個單詞的首字母大寫,檔案命名時,去除前面的“C”。
    • 當在一個頭檔案中包含另外一個頭檔案,不要包含全路徑。這就避免了依賴于作業系統方法引用的目錄路徑建立的可移植性問題。應該使用編譯器指令行标志來包含路徑,如 –l/路徑名。
    • 使用雙引号“”來包含本地頭檔案,用<>來包含作業系統或編譯器提供的頭檔案。
    • 為了友善使用腳本和make檔案,檔案名(目錄路徑)不應包含空格,括号“(”或其他作業系統部支援的非法字元。
  • 檔案格式:
    • 行結束: 對于跨平台開發,應該去除”^M”字元。可以采用下面方法來去除:
      • Command: dos2unix filename.cpp
      • vim: :1,$ s/{ctrl-V}{ctrl-M}//
    • 如果使用MS/Visual studio ,在檔案末尾加入包含至少一個空白的空行可以去除Unix下檔案的檔案結束标志“ctrl-D”。
  • 檔案頭:
    • 檔案頭應該包括版權聲明,釋出lincese.例如源代碼在GUN license下釋出的,需要聲明。如果該檔案包含公司的專有材料也應該聲明。如果代碼的license,copyright,釋出用途不同,需要将這些代碼劃分到不同的檔案中。
    • 注釋應該放置在檔案的最上面,用來說明該檔案的名字和檔案的内容。
  • 頭檔案:
    • C++ 經常用.hpp作為頭檔案名的字尾,而C用”.h”來作為頭檔案字尾。使用預定義宏來防止多次包含頭檔案。
#ifndef CLASS_NAME_H
#define CLASS_NAME_H
...
..
#endif      

o   減少在頭檔案包含檔案的個數,這樣可以減少建構build時間。如果一個類的頭檔案不需要使用另外一個類的資料成員,可以采用calss className的方式來聲明而不是包含該類的頭檔案。為了避免包含該類的全部聲明,可以采用引用或指針或者前向聲明該類。

o   前向聲明的例子:class className;

注意:STL容器(std::list 和 std::vector)和typedefs不能使用前向聲明,必須使用#include來包含。

o   如果C++中需要調用C函數,則在C頭檔案中應該使用下面的定義:

#ifdef __cplusplus
extern "C" {
#endif
...
..
C function declarations
..
...
#ifdef __cplusplus
}
#endif         

o   避免使用在”.hpp”頭檔案中使用””namespace”。如果該檔案包含在源代碼中,使用者将無法使用定義在namespace中的變量并且将導緻變量名沖突。

  • 類和結構體:
    • 類和結構體的定義一般使用大寫字母開頭。基類一般在類名後面添加”Base”作為字尾。在基類中的析構函數應該加上virtual。不是純虛函數不需”0”.
class ClassName
{
  public:
     // Constructors:
     // Destructor:
     // Functions: modifiers (set), selectors (get)
     // itterators:
     // Attributes visible by scope of instantiation and use
  protected:
     // Attributes visible to descendents
  private:
     // Local attributes
};      
  • 依賴于機器的代碼應該放置在不同的檔案中,易于移植。
  • 函數:
    • 函數體長度: 對于長度沒有硬性的規定,隻要容易了解就可以。如果不行,需要拆分成許多小的容易了解的部分。複雜的算法需要拆分成不超過50行的函數代碼。
    • 在CPP中函數的定義應該和頭檔案中聲明的函數順序一緻。
    • 行數名:使用互相補充的函數名: get/set, add/remove, create/destroy, start/stop, insert/delete, increment/decrement, begin/end, first/last, up/down, min/max, next/previous, open/close, show/hide, suspend/resume等。
    • 使用關鍵詞 "const"來标志在函數中不能改變值的變量。
  • 使用規則:
    • 使用大寫字母和下劃線來區分宏常量和枚舉。
    • 用單個大寫字母來标志變量中一個新詞、類名、函數名的開始。.

      如 thisIsAnExample

    • 函數名應該以小寫字母開始。.
    • 類的定義使用大寫字母開頭。 “C”開頭是匈牙利命名法,類的執行個體化應該以小寫字母開頭。如:

        CAbcXyz abcXyz

  • 不要使用在浮點數和0.0之間使用”==”。
  • 枚舉:使用枚舉應該使用它們聲明的使用範圍。
class ClassName
{
   enum Month { January, February };
}
 
Month tmpMonth = ClassName::January;      

不要使用: Month tmpMonth = ClassName::Month::January;

  • C++文法格式:
    • 在下面這些操作符的兩邊應該加一個空格 +, -, <. >, =, ==, ...
    • 使用空格來縮進,不要使用Tabs,因為在不同的IDE和編輯器可能對Tabs的定義不同。
    • 将長的 Boolean表達式和參數分行并且使用适當的縮進。
if( longVariableNameAbc < longVariableNameDef&&
   longVariableNameIjk < longVariableNameXyz)
{
}      
分隔:

改變一個單詞的字母為大寫來差別一個新詞的開始,這樣可以時變量更短,是因為不使用“_”。Examples:

  • VariableForTheBlueTeam
  • variableForTheBlueTeamInstantiation
  • SPAM_Eliminator

C++ 變量命名約定和風格

"匈牙利" 字首:.

m_

my_

Variable is a member of class. Some use the prefix "my" for class member variables and "our" for class member static variables. (Also "m" and "ms" for member and member-static) I have also seen the use of "_" as both a prefix and as a suffix to denote a class member variable. If using mixed languages remember that many FORTRAN compilers use a "_" suffix. Due to C++ name mangling there will probably be no conflict when using this notation. It is a common practice but theoretically could pose a problem with mixed languages.

_

(underscore)

  • Variable not intended to be exposed externally to the user. Internal workings only. Most often used by compiler and library authors.
  • Sometimes used (not preferred) as a suffix to repressent a class member variable.
  • Sometimes used as variable prefix for function arguments. When used with function arguments, it can represent in/out/inout:
    • _variable: Function input variable. More explicit: _inVariable
    • variable_: Function output variable. More explicit: outVariable_
    • _variable_: Input/output by function. More explicit: _inoutVariable_
Note: Dangerous when mixing C with FORTRAN as FUNCTION subroutines as suffixed with "_" in the object code. compiler flag "-fno-underscore".
__

Marks an use as extension to ANSI C++. Often not compiler independant. Usually reserved for use by compiler writers so it is best to avoid the double underscore.

Note: Be careful when mixing with FORTRAN as "__" is often generated in FORTRAN object symbol names. See the f77 compiler flag "-fno-second-underscore". Also used in Microsoft "Managed C++" directives.

a array

c

n

count / number of
cb count bytes / number of bytes
d Data type double
dw Data type double word
e an enumeration or element of an array

b

f

is

has

should

boolean

(flag)

Example: isFound

Note: accessor functions can also use these same prefixes: bool isBoolean{ return mBoolean; }

g_

g gbl

Gbl

global variable. Also used is the "::" operator. i.e. ::variable

s

s_

Static variable
h handle
i index to an array or STL iterator
l long data type. i.e. "long int"

p

ptr

pointer. Sometimes "Ptr" used as suffix.
lp pointer to long data type
ch C character
sz Zero terminated string. char[]
str C++ GNU template data type "string"
u unsigned
ev event
min Lowest value
first First element
lim array limit
cmd Command
cmp Compare
init Initialize
intr Interrupt
msg Message
rx Recieve
tx Transmit
C

Prefix for a Class name. Notation used by Microsoft MFC.

Example: CAbcXyz abcXyz

Note: The instatiation begins with a lower case letter while the class definition begins with a capital letter.

_t

_Type

Type definition (typedef - suffix). Prefix with capital letter.
_Enum Enumeration type definition suffix.
_ds Data structure suffix.

匈牙利命名例子::

  • ppachVarName: pointer to a pointer of an array of characters.
  • m_ppachVarName: class member variable which is a pointer to a pointer of an array of characters.

使用匈牙利命名法應該使代碼更容易讀而不是更複雜。有的人使用上面命名規則的一部分,如:m, _, g, s, e, b,i, n.

繼續閱讀