在.h/.cpp的开头应有一段格式统一的说明,内容包括:
xxxxxxxxxx例:/**********//**@file***//**@brief**//**@author*//**@date***//**********/除非极其简单,否则对函数应有注释说明。内容包括:功能、入口/出口参数,必要时还可有备注或补充说明。
每行代码的长度推荐为80列,最长不得超过120列;折行以对齐为准。
xxxxxxxxxx例: HANDLE CSOpenFile(const char cszFileName[], int nMode); 或者: BOOL CSReadFile( HANDLE hFile, void *pvBuffer, int nReadSize, int *pnReadSize ); 循环、分支代码,判断条件与执行代码不得在同一行上。
xxxxxxxxxx例:正确: if (n == -2) n = 1; else n = 2; 不得写做: if (n == -2) n = 1; else n = 2;指针的定义,* 号既可以紧接类型,也可以在变量名之前。
xxxxxxxxxx例: 可写做:int* pnsize; 也可写做:int *pnsize; 但不得写做:int * pnsize;在类的成员函数内调用非成员函数时,在非成员函数名前必须加上“::”。
函数入口参数有缺省值时,应注释说明。
xxxxxxxxxx例:BOOL KSSaveToFile(const char cszFileName[],BOOL bCanReplace /* = TRUE */);else if 必须写在一行。
与‘{’、‘}’有关的各项规定:
‘{’‘}’应独占一行,在该行内可有注释(如果没有独占一行,那么它的下一行必须是个空行(空行上可以放注释),‘{’前必须有一个空格
xxxxxxxxxx例:正确: for (i = 0; i < cbLine; i++) { // ..... printf("Line %d:", i); printf("%s\n", pFileLines); } for (i = 0; i < cbLine; i++) { // ..... printf("Line %d:", i); printf("%s\n", pFileLines); } 不得写做: for (i = 0; i < cb; i++) {printf("Line %d:", i); printf("%s\n", pFileLines);}‘{’之后的代码必须缩进一个Tab。‘{’与‘}’必须在同一列上。
xxxxxxxxxx例:正确: if (i > 0) { m = 1; n++; } 不得写做: if (i > 0) { m = 1; n++; } 例外: if (i == 0) { ASSERT(FALSE); return; }在循环、分支之后若只有一行代码,虽然可省略‘{’、‘}’,但不推荐这么做。若省略后可能引起歧义,则必须加上‘{’、‘}’。
与空格有关的各项规定。
在所有两目、三目运算符的两边都必须有空格。在单目运算符两端不必空格。但在‘->’、‘::’、‘.’、‘[’、‘]’等运算符前后,及‘&’(取地址)、‘*’(取值)等运算符之后不得有空格。
xxxxxxxxxx例:正确: int n = 0, nTemp; for (int i = nMinLine; i <= nMaxLine; i++) 不得写做: int n=0, nTemp; for ( int i=nMinLine; i<=nMaxLine; i++ )for、while、if 等关键词之后应有1个空格,再接‘(’,之后无空格;在结尾的‘)’前不得有空格。
xxxxxxxxxx例:正确: if (-2 == n) 不得写做: if(-2 == n) 或 if ( -2 == n )调用函数、宏时,‘(’、‘)’前后不得有空格。
xxxxxxxxxx例:正确: printf("%d\n", nIndex); 不得写做: printf ("%d\n", nIndex); printf( "%d\n", nIndex );类型强制转换时,‘(’‘)’前后不得有空格
xxxxxxxxxx例:可写做: (KSFile*)pFile; 也可写做: (KSFile *)pFile 不得写做: ( KSFile* )pFile ( KSFile * ) pFile与缩进有关的各项规定
缩进以 Tab 为单位。1 个 Tab 为 4 个空格
下列情况,代码缩进一个 Tab:
函数体相对函数名及‘{’、‘}’。
xxxxxxxxxx例: int Power(int x) { return (x * x); }if、else、for、while、do 等之后的代码。
一行之内写不下,折行之后的代码,应在合理的位置进行折行。若有 + - * / 等运算符,则运算符应在上一行末尾,而不应在下一行的行首。
下列情况,不必缩进:switch 之后的 case、default。
xxxxxxxxxx例: switch (nID) { case ID_PLAY: ...... break; case ID_STOP: ...... break; default: ...... break; } 匈牙利命名法:
基本原则是:
Camel命名法(即骆驼式命名法):
基本原则是:
Pascal命名法:
基本原则是:
除了异常类等个别情况(不希望用户把该类看作一个普通的、正常的类之情况)外,C++类/结构的命名应该遵循以下准则:
C++类/结构的命名
推荐的组成形式 *类的命名推荐用"名词"或"形容词+名词"的形式,例如:"CAnalyzer", "CFastVector" ....
不同于C++类的概念,传统的C结构体只是一种将一组数据捆绑在一起的方式。传统C结构体的命名规则为:
传统C结构体的命名
变量应该是程序中使用最多的标识符了,变量的命名规范可能是一套C++命名准则中最重要的部分:
变量的命名
格式
作用域前缀
类型前缀
推荐的组成形式
| 前缀 | 说明 |
|---|---|
| 无 | 局部变量 |
| m_ | 类的成员变量(member) |
| sm_ | 类的静态成员变量(static member) |
| s_ | 静态变量(static) |
| g_ | 外部全局变量(global) |
| sg_ | 静态全局变量(static global) |
| gg_ | 进程间共享的共享数据段全局变量(global global) |
| 前缀 | 说明 |
|---|---|
| n | 整型和位域变量(number) |
| e | 枚举型变量(enumeration) |
| c | 字符型变量(char) |
| b | 布尔型变量(bool) |
| f | 浮点型变量(float) |
| u | 无符号(unsigned) |
| p | 指针型变量和迭代子(pointer) |
| lp | 长指针型变量和迭代子(long pointer) |
| pfn | 特别针对指向函数的指针变量和函数对象指针(pointer of function) |
| g | 数组(grid) |
| str | 字符串(string) |
| i | 类的实例(instance)对于经常用到的类,也可以定义一些专门的前缀,如:std::string和std::wstring类的前缀可以定义为"st"std::vector类的前缀可以定义为"v"等等。 |
C++中引入了对常量的支持,常量的命名规则如下:
常量的命名
枚举、联合及typedef语句都是定义新类型的简单手段,它们的命名规则为:
枚举、联合、typedef的命名
| 缩写 | 全称 |
|---|---|
| addr | Address |
| adm | Administrator |
| app | Application |
| arg | Argument |
| asm | assemble |
| asyn | asnychronization |
| avg | average |
| DB | Database |
| bk | back |
| bmp | bitmap |
| btn | Button |
| buf | Buffer |
| calc | Calculate |
| char | Character |
| chg | Change |
| clk | Click |
| clr | color |
| cmd | Command |
| cmp | Compare |
| col | Column |
| coord | coordinates |
| cpy | copy |
| ctl/ctrl | Control |
| cur | Current |
| cyl | Cylinder |
| dbg | Debug |
| dbl | Double |
| dec | Decrease |
| def | default |
| del | Delete |
| dest/dst | Destination |
| dev | Device |
| dict | dictionary |
| diff | different |
| dir | directory |
| disp | Dosplay |
| div | Divide |
| dlg | Dialog |
| doc | Document |
| drv | Driver |
| dyna | Dynamic |
| env | Environment |
| err | error |
| ex/ext | Extend |
| exec | execute |
| flg | flag |
| frm | Frame |
| func/fn | Function |
| grp | group |
| horz | Horzontal |
| idx/ndx | Index |
| img | Image |
| impl | Implement |
| inc | Increase |
| info | Information |
| init | Initial / Initialize / Initializatioin |
| ins | Insert |
| inst | Instance |
| INT / intr | Interrupt |
| len | Length |
| lib | Library |
| lnk | Link |
| log | logical |
| lst | List |
| max | maximum |
| mem | Memory |
| mgr / man | Manege / Manager |
| mid | middle |
| min | minimum |
| msg | Message |
| mul | Multiply |
| num | Number |
| obj | Object |
| ofs | Offset |
| org | Origin / Original |
| param | Parameter |
| pic | picture |
| pkg | package |
| pnt / pt | Point |
| pos | Position |
| pre / prev | previous |
| prg | program |
| proc | Process / Procedure |
| prop | Properties |
| psw | Password |
| ptr | Pointer |
| pub | Public |
| rc | rect |
| ref | Reference |
| reg | Register |
| req | request |
| res | Resource |
| ret | return |
| rgn | region |
| scr | screen |
| sec | Second |
| seg | Segment |
| sel | Select |
| src | Source |
| std | Standard |
| stg | Storage |
| stm | Stream |
| str | String |
| sun | Subtract |
| sum | summation |
| svr | Server |
| sync | Synchronization |
| sys | System |
| tbl | Table |
| temp / tmp | Temporary |
| tran / trans | translate / transation / transparent |
| tst | Test |
| txt | text |
| unk | Unknown |
| upd | Update |
| upg | Upgrade |
| util | Utility |
| var | Variable |
| ver | Version |
| vert | Vertical |
| vir | Virus |
| wnd | Window |
参考: