游戏开发论坛

 找回密码
 立即注册
搜索
查看: 47419|回复: 44

[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

[复制链接]

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 2004-10-5 17:51:00 | 显示全部楼层 |阅读模式
C/C++语言编码规范
来自:CSDN
1.说明
为了保证在软件开发过程中,全体成员的代码风格一致,便于维护,提高软件产品的质量和保持开发产品的延续性,特制定本编码规范。本规范详细规定了源代码书写、变量命名、函数/过程的书写、错误和异常处理等方面。
2. 程序约定
2.1 排版规则
程序应采用缩进风格编写,每层缩进使用一个制表位(TAB),类定义、方法都应顶格书写;
左花括号要另起一行,不能跟在上一行的行末;
一个变量定义占一行,一个语句占一行;
对独立的程序块之间、变量说明之后必须加空行;
对于较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;
循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分;
在结构成员赋值等情况,等号对齐,最少留一个空格;
若函数或过程中的参数较长,则要进行适当的划分。
形参的排序风格:
Ø        最常使用的参数放在第一位;
Ø        输入参数列表应放在输出参数列表的左边;
Ø        将通用的参数放在特殊的参数的左边
2.2 命名约定
2.2.1 应用程序的命名
“公司缩写”+模块名称+[版本]
2.2.2 子模块的命名
每个子模块的名字应该由描述模块功能的1-3以单词组成。每个单词的首字母应大写。在这些单词中可以使用一些较通用的缩写。
2.2.3 变量的命名
变量的命名的基本原则是使得变量的含义能够从名字中直接理解。可以用多个英文单词拼写而成,每个英文单词的首字母要大写,其中英文单词有缩写的可用缩写;变量的前缀表示该变量的类型;对于作用域跨越10行以上的变量名称不能少于4个字符,除循环变量,累加变量外不得使用I、j、k等名称的变量。变量分为取全局变量和局部变量,对于全局变量以加前缀“g_”来区分。
sf_2004105175133.jpg

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 2004-10-5 17:51:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

另外,要注意的是:全局变量在程序中不要定义太多,能用局部变量的就用局部变量。如果要使用相关的变量,建议采用类的方式或者结构的方式存放,以减少具体变量的个数。   
2.2.4 常量的命名
常量所有的字母均为大写。并且单词之间使用下划线”_”隔开。
2.2.5 函数/过程的命名
函数/过程名称应该尽量使用能够表达函数功能的英文名称,函数名称中应该禁止使用如同function1,function2等含义不清的名称。单词间应该使用大小写分隔。全局函数/过程名称以“g_”前缀开始。
2.2.6 接口命名
        接口名称要以大写字母开头。如果接口包含多个单词,每个单词的首字母大写,其他字母小写,如果,这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写为Xml)
2.2.7 类的命名
类名称要以大写字母开头;
类名称如果包含多个单词,每个单词的首字母要大写,其他字母小写;如果这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写作Xml);
类名称应该是一个名词或名词短语;
类成员变量的命名规则与上述规则相同,但是要以“m_”开始,表示其为成员变量(Member);
类名称不能出现下划线。
2.2.8 方法的命名
方法名称以小写字母开头;
方法名称如果包含多个单词,除了第一个单词外,每个单词的首字母大写,其它字母小写。如果这些单词是缩略语(例如XML),也要首字母大写,其它字母小写(写作Xml)。
方法名称应该是一个动词或动名词短语,意思是“完成什么功能”,“执行什么操作”;
2.2.9 数据库的命名
表:采用“模块名简称+前缀+’_’+表名”的命名规则。
Ø        表名Ø        以能理解该表的内容为原则,Ø        可由中文表示,Ø        也可由代表此表含义的英文字母组成,Ø        首字母大写;
Ø        前缀代表此表类别。
视图:采用“模块名+’_’+视图名+’视图’”的命名规则,通常由8个以内汉字组成。
存储过程:采用“Proc+模块名+’_’+存储过程名”的命名规则。
触发器:采用“模块名+’_’+触发类型+’_’+表名”的命名规则,如果有多个触发类型,则可以叠加在一起。
字段:字段的命名以能理解该字段的含义为原则,通常由多个英文单词加前缀拼写而成,而组成字段名称的首字母应大写。单词有缩写的可用缩写。字段的前缀表示该字段的数据类型,其取值详见“数据类型”描述。原则上,字段的命名长度不超过18字节;描述字段的中文名称,用数据库创建工具设计数据库时,需要输入。
2.3 参数的约定
    2.3.1 输入参数的约定
有些函数有输入参数,这些参数指由函数外部(调用者)输入,并在函数内部使用。在函数业务流程说明后跟输入参数说明区,用“输入参数”或“Input Parameters”标记。在参数名列表中的每个参数后增加该参数的注释。
2.3.2 输出参数的约定
有些函数有输出参数,这些参数指由函数外部(调用者)定义,在函数内部使用并返回给调用者的参数。在输入参数说明区后跟输出参数说明区,用“输出参数”或“Output Parameters”标记。在参数名列表中的每个参数后增加该参数的注释。另外输出参数一般以指针或应用输出。
2.3.3 返回值的约定
每个函数均有返回值,除非操作非常简单。对于有不同状态的返回值,建议用long型的返回值,0为成功。对于出错类返回值,在同一层次的模块,用统一代码表示。在输出参数说明区后跟返回值说明区,用“返回值”或“Return Values”标记。返回值说明,要说明各种不同类型返回值以及它们的含义。
2.4 注释约定
在软件中对每个文件头,自定义函数和变量,重要的处理过程都要有必要的注释。
2.4.1 源程序头的注释和规范
每个文件头插入注释,标明文件的用途和作者,注释如下:(注释尽量用中文)
    //程序名称
    //版权说明
    //版本号:
//功能:
//开发人:
//开发时间:
//修改者:
//修改时间
//修改简要说明
//其他
2.4.2 函数的注释
每个函数前面注明函数的功能和输入,输出。注释为:
//名称
//功能:(说明函数的功能)
//输入参数:(说明每个输入参数的用途和取值约定)
//输出参数:(说明每个输出参数的用途和取值约定)
//返回:(说明返回值,返回值的含义和约定)
2.4.3 变量注释
直接在变量后面注明变量的用途和取值约定,如:
int status;                         //记录处理状态,0: 成功,1: 错误
2.4.4 类型定义注释
指类和记录等等定义的注释。在注释中标明定义的用途。
2.4.5 区的注释
同一个类的成员方法要求排列在一起,共同协作而实现同一个功能的函数和过程要求排列在一起。代码通常使用几个函数和过程来实现某一项功能,这时候需要使用区注释将这些具有共同目的的函数和过程标明出来。
使用整行的”*”作为隔离行,让程序清晰可读。
一般删除的代码不建议直接删除,最好用“//”注释起来。
2.4.6 代码中的注释
在代码中要求注释的地方有:
代码中的关键部分;
在使用特殊算法或者逻辑性较强的代码;
在修改或删除代码部分,需要加注释;修改/删除人,目的.
2.5 变量的作用范围
尽量做到缩小变量的作用范围,对于变量是指针的,应遵循以下约定:
在局部分配的空间在局部释放。
函数体内不能分配空间并将空间指针作为函数参数返回。
动态全局空间在程序结束时一定要释放。
所有动态分配的空间在对应层次的模块释放,并且用完马上释放。不重复释放相同的指针。
2.6 函数/过程的定义
在函数的定义处应当增加本函数的功能描述的注释。
用一句话描述清楚功能。
可用英文或中文。
功能注释格式要求所有代码一致。
2.7 函数业务流程的定义
在函数功能描述后,要增加函数的主要业务流程注释。
可以用多行描述,以解释清楚业务流程为主。
可用英文或中文。
业务流程注释格式要求所有代码一致。
业务流程注释可以尽量详细,注释的长度可以与代码长度差不多,但是不要太长。
比如处理N阶乘的函数业务流程定义如下:
/* Process: N factorial use callback function to implement. If N == 0 then */
/* return 1 else return N-1 factorial.                               */

/* 过程:N阶乘利用回调函数实现。如果N等于零,则返回1,   */
/* 否则返回 N-1的阶乘。                                    */
注意:函数业务流程的说明并不在乎有多长,但是在乎能否说明过程。有些像N阶乘的函数流程比较简单,但是有些比较复杂。当比较复杂时,可以用标号来说明。
3. 接口/函数过程调用的约定
几乎每一个项目中,都存在开发接口API给其他应用调用,本规范适用于标准C开发接口API。
3.1 头文件(.h文件)
提供给使用API的应用的标准C头文件。头文件必须包含三部分。
防止头文件重复引用的编译条件
即我们在创建头文件时必须增加以下的条件编译:#ifndef  #define  #endif。比如要防止abcqueue.h头文件被重复引用,必须在abcqueue.h增加以上的条件编译:
#ifndef _ABCQUEUE_H
#define _SMBUS_H
……
#endif
函数定义
函数的定义是为了方便应用知道LIB、DLL里引出了怎样的API,应该如何使用。如上面的例子。
错误代码定义
错误代码是接口API里因为内部某种错误返回的代码,它告诉应用出现了什么错误,以便开发者进行调试和排错。
3.2 函数
提供给应用调用的执行体。实现函数时,必须根据以下规范开发
3.2.1 变量定义
在函数代码中,变量的定义必须放在第一部分,同时给指针类型的变量赋空(NULL)。
3.2.2 参数合法性检查
在使用应用传递的输入输出参数之前,必须对参数进行合法性检查,保证代码执行使用参数的安全性。比如,应用的一个输出参数地址为NULL,如果处理之前不检查参数的合法性,那么将导致一个内存错误;如果检查合法性,就不会造成代码执行时出现问题。
3.2.3执行处理
在处理代码开发中,必须注意以下的一系列的问题:
对应用传递的输入输出参数,禁止使用strcpy, strlen, strcat, strcmp等相应的函数操作输入输出参数,尽量使用strncpy, memcpy等含有处理长度参数的函数进行处理。
必须先分配系统资源,才能分配函数内部需要的资源;相反,必须首先释放函数内部分配的资源,再释放系统资源。
3.2.4 返回值
对外接口API必须返回返回值给应用。
4. 错误和异常处理规范
4.1 出错类型定义约定
在整个系统软件产品的出错定义要一致;
统一模块层次的出错类型统一定义;
出错类型分为错误、警告、提示等三类信息,分别用E、W、I开头;
错误代码统一用宏描述,并且放在一个头文件中;
出错代码的宏定义还要加注对这个代码的说明;
出错代码有相应的文档指明代码的定义规则。
例子:有ErrorDef.h中有如下定义:
// **************************************************************
// Error Code Macro Define
// **************************************************************
// Error Code
#define E_OK                       0x0        // 没有错误
#define E_NO_ENOUGH_MEMORY    0x1001     // 内存不足
#define E_INVALID_HANDLE         0x1002    // 无效的句柄

// Warning Code
#define W_CUT_RECV_DATA                        0x2001    // 裁剪接收数据
#define        W_        FIND_OLD_MESSAGE     0x2002    // 发现老的消息

// Information Code
#define I_SEND_SUCCEED            0x9001    // 发送成功
注意:出错类型的定义一定要统一,并且一定要注意编码问题。
4.2异常的捕获
在程序中会出现各种异常,如除0错误、内存错误都要处理。要有异常可能的都要捕获。
4.3异常和错误的处理
每个函数独立处理内部的异常,对影响结果的异常通过返回值返回。对于在函数内部不能处理的异常,捕获后已另外的形式向调用者抛出,但是要在接口文档中详细写明。
注意:处理异常一般有两种方法,一是通过将异常转化为另一个异常抛出,二是通过函数返回值返回。在本规范中,我们倾向于用第二种方法。

37

主题

727

帖子

740

积分

高级会员

Rank: 4

积分
740
发表于 2004-10-5 17:56:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

简单看了一下
谢谢楼主
楼主,我把我Q号发去你短信箱了
有空交流

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-10-6 06:27:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

。。。。每个人都有自己的习惯,不用太教条,要教条可以去看匈牙利命名法则。

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-10-7 00:46:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

好的规范使得代码易读,不易出错。

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2004-10-7 16:00:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

别说太多, 让"天使"也牛一下嘛.

3

主题

186

帖子

190

积分

注册会员

Rank: 2

积分
190
发表于 2004-10-10 12:01:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

根据开发团队大家的习惯来制订一个规则比较好一点
这样没必要更改多数人的习惯

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2004-10-10 13:00:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

风舞影天!!! 天啊! 你这会在什么公司啊?

4

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2004-10-10 13:52:00 | 显示全部楼层

Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的

我以前公司的编码规范的一小部分。由于是WORD文档,贴在这里排版可能有些乱。
说明:这是公司里数以千计的开发人员必须遵守的规则,不是教条。
自由发挥的编程风格只适用于手工作坊、几个人的小公司,对于需要数以十计、百计的技术人员协作的项目,更需要工程化的规定。每个人确实是一颗小螺丝了,也许有些残酷,但是事实就是这样的。

一.排版
1.1规则:程序块应采用缩进风格编写,缩进的空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
1.2规则:相对独立的程序块之间、变量说明之后应加空行。
示例:如下例子不符合规范。
if( DD_OK != lpSurface->Flip() )
{
    ... // program code
}
sprite++;
waitTime(30);

应如下书写
if( DD_OK != lpSurface->Flip() )
{
    ... // program code
}

sprite++;
waitTime(30);
1.3规则:较长的语句(>80字符)要分成多行书写。
长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE
                          | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
videoBuffer[x+indexX+(y+indexY)*pitch] = bitmapBufferOffset
                                                                                + bitmap[indexX+indexY*bitmapWidth]               
1.4规则:循环、判断等语句中若有较长的语句,则应进行适应的划分。
应首先考虑在分号处划分新行,其次长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
示例:
if( (NULL != backSurface ))
    && (NULL != primarySurface)))
{
    ... // program code
}

for(i = 0, j = 0; (i < back[pixel].Width) && (j < back[pixel].Height);
i++, j++)
{
    ... // program code
}

for(i = 0, j = 0;  
             (i < backBufferWidth) && (j < backBufferHeight);  
             i++, j++)
{
    ... // program code
}
1.5规则:若函数或过程中的参数较长,则应进行适当的划分。
示例:
createDirectDraw(NULL,(void**) &pDirectDraw,
                   IID_IdirectDraw7, NULL);

PDirectDraw->CreatePalette( DDPCAPS_8BIT | DDPCAPS_ALLOW256
| DDPCAPS_INITIALIZE, palette,&pddpal,NULL );
1.6规则:一行只写一条语句。
示例:如下例子不符合规范。
rect.length = 0;  rect.width = 0;

应如下书写
rect.length                = 0;
rect.width                = 0;
1.7规则:条件判断语句语句应独占一行,且主判断语句的执行语句部分需加块符号。
如C/C++中的条件语句if、for、do、while、case、switch、default等都应按此规则排版(其中if、for、do、while、switch为主判断语句)。
示例:如下例子不符合规范。
if(NULL == backBuffer) return;

应如下书写:
if(NULL == backBuffer)
{
    return;
}
1.8推荐:对齐只使用TAB键,不使用空格键。
说明:目前绝大多数编辑器都支持TAB键长度调整,此时应将TAB键长度设置为4;而空格键操作较为繁琐,而且在使用键盘时有所不便,应尽量避免使用空格键来进行对齐操作。
1.9规则:程序块中的代码应采用缩进风格。
这里的程序块包括函数、过程、方法、数据结构定义、循环体、判断体、case语句体等。
示例:如下例子不符合规范。
void exampleFun( int errCOde )
{
for (...)
{
loop ++;
    ... // program code
}


int first = 0;
switch( errCode )
{
case DDERR_SURFACELOST:
drawSurface->restore();
break;
case ...
}
    ... // program code
}

应如下书写。
void exampleFun( int errCOde )
{
for (...)
{
loop ++;
    ... // program code
}

int first = 0;

switch( errCode )
{
case DDERR_SURFACELOST:       
drawSurface->restore();
break;
case ...
}

    ... // program code
}
1.10规则:程序块的分界符应各独占一行并与引用它们的语句左对齐。
在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
示例:如下例子不符合规范。
for(...) {
    ... // program code
}

if(...)
    {
    ... // program code
    }

void exampleFun( void )
    {
    ... // program code
    }

应如下书写。
for(...)
{
    ... // program code
}

if(...)
{
    ... // program code
}

void exampleFun( void )
{
    ... // program code
}
1.11规则:说明性文件中对来自不同源代码文件中的说明应分块进行。
1.12规则:进行相关赋值或者初始化时,应进行字段对齐。
        如对关系较为紧密的结构成员、数组、宏进行定义初始化时,要进行字段对齐。
        示例:
        struct BufferManager msgBuf[]=
{
{ LockSize, 54,                NULL,        0, 0, 0 },
{ LockSize, 280,          NULL,        0, 0, 0 },
{ LockSize, 10,           NULL,        0, 0, 0 },
{ LockSize, 10,                NULL,        0, 0, 0 }
};
       
        rect.top        = 0;
        rect.left         = 0;
        rect.right        = 300;
        rect.bottom        = 200;

#define MaxScrnWidth                640
#define MaxScrnHeight                480
1.13推荐:在语句中间添加适量空格,以使得代码更清晰。
在两个以上的关键字、变量、常量进行对等操作时,操作符前后要加空格;进行非对等操作时,如果是关系密切的操作符(如类中的.和->),后不应加空格。采用这种松散方式编写代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间可以不加空格,因为在C/C++语言中括号已经是最清晰的标志了。
在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。

示例:
(1) 逗号、分号只在后面加空格。
int a, b, c;

(2)比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。
if (timeTicks >= MaxTicks)
{
timeTicks = 0;
    ... // program code
}

(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
*p = 'a';                // 内容操作"*"与内容之间
flag = !isEmpty;         // 非操作"!"与内容之间
p = &mem;                // 地址操作"&" 与内容之间
i++;                             // "++","--"与内容之间

(4)"->"、"."前后不加空格。
lpDraw->id = pid;        // "->"指针前后不加空格

(5) if、for、while、switch等与后面的括号间可以加空格,使if等关键字更为突出、明显;也可以不加空格,使得if等关键字与条件联系更紧密。无论如何,开发人员只应选择其中一种形式,并在同一产品开发中保持一致的风格。
if ( a>=b && c>d )或者
if( a>=b && c>d )

(6) 在if、for、while、switch等语句,如为多条件组合形式,条件内部可以不加空格,以使各条件更明确。
if ( lines>=height && chars>width && size>maxSize )
1.14推荐:一行程序以小于80字符为宜,不要写得过长。
考虑在大多数情况下一行程序在屏幕显示时的可见性,一行程序不宜过长,目前建议不大于80个字符。

二.注释
2.1推荐:一般情况下,源程序有效注释量应在20%~40%之间。
注释的原则是有助于对程序的阅读理解。
对于重点函数/方法的解释,和函数/方法中关键算法、复杂操作或者与特定内容相关的程序部分,以及看来显然不合理的(但是实际上是合理的)程序部分,应给出清楚、简洁的注释。
如果本身已经比较清楚的程序部分,不宜再进行注释。过多的注释反而会降低程序的可读性。
本规则推荐在源程序的注释量,并非强制要求。然而在通常情况下,大多数源程序的有效注释量应在此范围内。
2.2规则:说明性文件头部应进行注释。
说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)的注释应列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。
示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
/*************************************************
  Copyright (C), 1988.1999, XXXX Tech. Co., Ltd.
  File name:              // 文件名
  Author:      
Version:        
Date:                         // 作者、版本及完成日期
  Description:            // 用于详细说明此程序文件完成的主要功能,与其他模块
                          // 或函数的接口,输出值、取值范围、含义及参数间的控
                          // 制、顺序、独立或依赖等关系
  Others:                 // 其它内容的说明
  Function List:          // 主要函数列表,每条记录应包括函数名及功能简要说明
    1. ....
  History:                // 修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述  
    1. Date:
       Author:
       Modification:
    2. ...
*************************************************/
2.3规则:源文件头部应进行注释。
源文件头部应列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。
示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
/************************************************************
  Copyright (C), 1988.1999, XXXX Tech. Co., Ltd.
  FileName: test.cpp
  Author:        Version :          Date:
  Description:     // 模块描述      
  Version:         // 版本信息
  Function List:   // 主要函数及其功能
    1. -------
  History:         // 历史修改记录
      <author>  <time>   <version >   <desc>
      David    96/10/12     1.0     build this moudle  
***********************************************************/
说明:Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。
2.4规则:函数头部应进行注释。
函数注释要列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
对于简单、自说明的函数可以不做出全面的注释。
示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
/*************************************************
  Function:       // 函数名称
  Description:    // 函数功能、性能等的描述
  Calls:          // 被本函数调用的函数清单
  Called By:      // 调用本函数的函数清单
  Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
  Table Updated:  // 被修改的表(此项仅对于牵扯到数据库操作的程序)
  Input:          // 输入参数说明,包括每个参数的作
                  // 用、取值说明及参数间关系。
  Output:         // 对输出参数的说明。
  Return:         // 函数返回值的说明
  Others:         // 其它说明
*************************************************/
2.5推荐:边写代码边写注释。
修改代码的同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
2.6规则:注释的内容应清楚、明了,含义准确,防止注释二义性。
错误的注释不但无益反而有害。
2.7规则:避免在注释中使用缩写,特别是非常用缩写。
如确需使用缩写,在使用缩写之前,应对缩写进行必要的说明;标准的缩写(如国家标准、行业标准、企业标准),可以在注释中使用,此时仍然建议对缩写进行必要的说明。
2.8规则:注释应与其描述的代码紧邻。
对代码的注释应放在其紧上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于紧上方则需与其上面的代码用空行隔开。如放于右方且有多条注释相邻,各注释应对齐。
示例:如下例子不符合规范。
/* 初始化鼠标输入设备,并设置为相对坐标方式 */

LPDIRECTINPUT8 pDi;//DX输入
IDIRECTINPUTDEVICE8 mouse;//鼠标输入设备
initDirectDraw();
pDi->CreateDevice(GUID_SysMouse, &mouse, NULL);
mouse->SetCooperativeLevel(mainWndHwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
mouse->SetDataFormat(&c_dfDIMouse);
mouse->Acquire();
initKeyboard();

应如下书写
initDirectDraw();

LPDIRECTINPUT8 pDi;                        //DX输入
IDIRECTINPUTDEVICE8 mouse;                //鼠标输入设备

/* 初始化鼠标输入设备,并设置为相对坐标方式 */
pDi->CreateDevice(GUID_SysMouse, &mouse, NULL);
mouse->SetCooperativeLevel(mainWndHwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
mouse->SetDataFormat(&c_dfDIMouse);
mouse->Acquire();

initKeyboard();
2.9规则:对于特定含义的标识符,如其命名不是充分自说明的,声明时应加以注释。
变量、常量、宏的注释应放在其紧上方相邻位置或右方。
示例:
/* 精灵总数 */
#define MaxSprite 1000

#define MaxSurface 1000 /* Ddraw表面总数 */
2.10规则:数据结构声明,如其命名不是充分自说明的,声明时应加以注释。
对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
示例:可按如下形式说明枚举/数据/联合结构。
/* 在16色下颜色代码 */
enum  COLOR
{
    BLACK,        /* 黑色 */
RED,           /* 红色 */
...
    WHITE,        /* 白色*/
};
2.11规则:全局变量应有较详细的注释。
包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
示例:
/* 当函数失败时返回错误码,保存在全局变量errCode中 */                // 变量作用、含义
/* errCode为不等于0的任意长整数;具体数值由开发工具确定*/           // 变量取值范围
/* errCode仅供errman.cpp调用 */                                                    // 使用方法
LONG errCode;  
2.12规则:注释与所描述内容应进行同样的缩排。
说明:可使程序排版整齐,并方便注释的阅读与理解。
示例:如下例子,排版不整齐,阅读稍感不方便。
void fun( void )
{
/* code one comments */
    CodeBlock One

        /* code two comments */
    CodeBlock Two
}

应改为如下布局。
void fun( void )
{
    /* code one comments */
    CodeBlock One

    /* code two comments */
    CodeBlock Two
}
2.13推荐:对重要变量的定义和分支语句(条件分支、循环语句等)应编写注释。
说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。
2.14规则:不中断的case语句应加注释。
对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。这样比较清楚程序编写者的意图,有效防止无故遗漏break语句。本规则是2.2.1的细化。
示例:
case DIK_DOWN:
    ProcessDown();
    break;
case DIK_RIGHT:  
    ProcessRight();
ProcessCFW_B();
//不要break出去,因为还要处理向前行走的逻辑
case DIK_END:   
    ProcessEnd();   
    break;
...
2.15推荐:避免在一行代码或表达式的中间插入注释。
说明:除非必要,不应在代码或表达中间插入注释,否则容易使代码可理解性变差。
2.16推荐:对程序单元应进行正确的命名以及合理组织代码的结构,使代码自说明。
说明:清晰准确的函数、过程、结果、变量等的命名,可增加代码可读性,并减少不必要的注释。
2.17推荐:应在代码的功能、意图层次上进行注释,提供有用、额外的信息。
说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。本规则是2.2.1的细化。
示例:如下注释意义不大。
/* 如果receiveFlag设置为true */
if( receiveFlag )
...
而如下的注释则给出了额外有用的信息。
/* 如果收到其它精灵的消息 */
if( receiveFlag )
...
2.18推荐:应在程序块的结束行右方加注释标记,以表明某程序块的结束。
说明:当代码段较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读。
示例:参见如下例子。
if(...)
{
    // program code

    while(index < MaxSprite)
    {
        // program code
    }         /* end of while(index < MaxSprite) */ // 指明该条while语句结束
} /* end of  if (...)*/ // 指明是哪条if语句结束
2.19推荐:注释应考虑程序易读及外观排版的因素。
注释语言不统一,影响程序易读性和外观排版,使用的语言若是中、英兼有的,建议使用中文。

3

主题

186

帖子

190

积分

注册会员

Rank: 2

积分
190
发表于 2004-10-10 16:02:00 | 显示全部楼层

Re: Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅

playerwing: Re:[转载]C/C++语言编码规范,在您进行编码之前应该阅读的规范

风舞影天!!! 天啊! 你这会在什么公司啊?

呵呵,在吴杰和杨力后来去的那家公司哈
嘿嘿~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 11:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表