第三章 标识符命名
规则3-1:命名尽量使用英文单词,力求简单清楚,避免使用引起误解的词汇和模糊的缩写,使人产生误解
说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。
示例:如下单词的缩写能够被大家基本认可。
temp 可缩写为 tmp ; flag 可缩写为 flg ; statistic 可缩写为 stat ; increment 可缩写为 inc ; message 可缩写为 msg ;
规则3-2:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一 说明:
1. 如在UNIX系统,可采用全小写加下划线的风格或大小写混排的方式,但不能使用大
小写与下划线混排的方式。
2. 用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的 示例:
Add_User不允许,add_user、AddUser、m_AddUser允许。
建议3-1:变量的命名可参考“匈牙利”标记法(Hungarian Notation):TypePrefix+ Name
说明:以下的基本变量前缀可供参考: 前缀 含义 示例 说明
p s str sz psz h c by y n f d b u w Pointer String CString zero-terminated null-terminated string Handle Character (char) Byte or Unsigned Char Integer (int) Float Double Bool Unsigned... WORD or Unsigned Integer char* pszName String sName; CString strName; 很多情况下, p总是和它所指向的变量的类型前缀一起使用。 char szName[16]; char* pszName; HWND hWindow char cLetter; Sometimes c is used to denote a counter object. byte byMouthFull; byte yMouthFull; int nSizeOfArray; float fRootBeer; double dDecker; bool bIsTrue; BOOL bIsTrue; int bIsTrue; An integer can store a boolean value as long as you remember not to assign it a value other than 0 or 1 unsigned wValue; int Sometimes l is appended to p to denote that the pointer is a long. For example: lpszName is a long pointer to a zero-terminated string. l Long long lIdentifier; dw DWORD or Unsigned Long Integer Class CObject; Class Object; struct SPlayer; C or just a capital Class first letteri S Struct C is used heavily in Microsoft's Foundation Classes but using just a capital first letter is emphasized by Microsoft's J++. I class IMotion { Interface (ususally a struct public: or class with only pure virtual void virtual methods and no Fly() = 0; member variables) }; class CRocket { public: class XMotion:public IMotion { Used extensively in COM. X Nested Class Used extensively in COM.
public: void Fly(); } m_xUnknown; } class CAirplane { public: class XMotion:public Instantiation of a nested IMotion { Used extensively in COM. class. public: void Fly(); } m_xUnknown; } class CThing { private: int m_nSize; }; x m_ Class Member Identifiers g_ Global Constant globals are usually in all caps. The g_ would denote String* g_psBuffer that a particular global is not a constant. void* pvObject stPlayer In most cases, v will be included with p because it is a common trick to typecast pointers to void pointers. v st
Void (no type) Struct variable 规则3-3:常量、宏和模板名采用全大写的方式, 每个单词间用下划线分隔
建议3-2: 枚举类型enum 常量应以大写字母开头或全部大写 建议3-3:命名中若使用了特殊约定或缩写,则要有注释说明
说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。
规则3-4:自己特有的命名风格,要自始至终保持一致,不可来回变化
说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。
规则3-5:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的
说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。
建议3-4:除非必要,不要用数字或较奇怪的字符来定义标识符
示例:
1. 如下命名,使人产生疑惑: #define _EXAMPLE_0_TEST_ #define _EXAMPLE_1_TEST_ void set_sls00( BYTE sls );
应改为有意义的单词命名
#define _EXAMPLE_UNIT_TEST_ #define _EXAMPLE_ASSERT_TEST_ void set_udt_msg_sls( BYTE sls );
2. 避免使用看上去相似的名称,如“l”、“1”和“I”看上去非常相似
建议3-5:函数名以大写字母开头,采用谓-宾结构(动-名),且应反映函数执行什么操作以及返回什么内容
说明:函数在表达式中使用,通常用于 if 子句,因此它们的意图应一目了然。 示例:
不好的命名:if (CheckSize(x))
没有帮助作用,因为它没有告诉我们 CheckSize是在出错时返回 true 还是在不出错时返回 true。 好的命名:if (ValidSize(x))
则使函数的意图很明确。
建议3-6:类、结构、联合、枚举的命名须分别以C、S、U、E开头,其他部分遵从一般变量命名规范
第四章 可读性
规则4-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。 说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。
示例:下列语句中的表达式
word = (high << 8) | low (1) if ((a | b) && (a & c)) (2) if ((a | b) < (c & d)) (3) 如果书写为
high << 8 | low a | b && a & c a | b < c & d 由于
high << 8 | low = ( high << 8) | low, a | b && a & c = (a | b) && (a & c), (1)(2)不会出错,但语句不易理解;
a | b < c & d = a | (b < c) & d,(3)造成了判断条件出错。
建议4-1:不要编写太复杂 、多用途的复合表达式
规则4-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。 示例:如下的程序可读性差。
if (Trunk[index].trunk_state == 0) {
Trunk[index].trunk_state = 1; ... // program code }