编程规范

本文详细介绍了C++编程规范,涵盖排版、注释、标识符命名、变量与结构定义、函数使用、可测性增强及宏定义等方面。通过具体实例阐述了如何遵循这些规范以提高代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目 录

1 排版

2 注释

3 标识符命名

4 变量、结构

5 函数、过程

6 可测性

7 宏

 

 

1 排版

1-1:程序块的{}的写法。

示例:如下例子不符合规范。

for (int i=0; i<5; i++){

... // program code

}

应如下书写

for (int i=0; i<5; i++)

{

... // program code

}

1-2:函数和文件的大小控制

一般情况下,函数小于40行;

文件大小小于1000行。

1-3:头文件路径使用相对路径;头文件引用全部放在一个文件中。

1-4:include文件顺序

说明:文件路径必须使用相对路径;一般include文件的顺序如下(从左往右):

C system files; C++ system files; other libraries’ .h文件; your project’s .h文件

对于工程中使用到的支持stl的头文件,也放到比较高级的顺序中。

 

2 注释

2-1:一般情况下,源程序有效注释量必须在20%以上。

说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不

能太少,注释语言必须准确、易懂、简洁。

2-2:注释用中文即可。

说明:英文注释,不同人的注释理解不一样;语句比较杂乱,拼写错误比较多。

2-3:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有

用的注释要删除。

2-4:注释的内容要清楚、明了,含义准确,防止注释二义性。

说明:错误的注释不但无益反而有害。

2-5:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)

相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

示例:如下例子不符合规范。

例 1:

// 宽度

width = rect.width;

height = rect.height;

例 2:

width = rect.width;

height = rect.height;

// 高度

例 3:

void Init()   // 初始化函数

{

    ...

}

应如下书写

width = rect.width;  //宽度

height = rect.height;    //高度

 

// 初始化函数

void Init()

{

    ...

}

 

3 标识符命名

3-1: 标识符的命名,遵循最小化、最短化原则。

说明:一般不超过4个字符,但能被区分识别;可以加上必要的注释;禁止使用单个字符(3-4)。

3-2:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的

缩写,避免使人产生误解。

说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成

缩写;一些单词有大家公认的缩写。

示例:如下单词的缩写能够被大家基本认可。

temp 可缩写为 tmp ;

flag 可缩写为 flg ;

statistic 可缩写为 stat ;

increment 可缩写为 inc ;

message 可缩写为 msg ;

3-3:命名中若使用特殊约定或缩写,则要有注释说明。

说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进

行必要的注释说明。

3-4:对于变量命名,禁止取单个字符(如ijk...),建议除了要有具体含义外,还能

表明其变量类型、数据类型等,但ijk作局部循环变量是允许的。

说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i 写成j),而编

译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。

3-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,用作特殊

标识如标识成员变量或全局变量的m_g_,其后加上小写的方式。

示例: m_Player 不允许, m_player 允许。

3-6:namespace命名:不能太长,力求简单、精巧明了、明了;不建议使用命名空间套用命名空间。

例:

建议:socket底层一个命名空间,协议一个命名空间。

协议的命名空间命名做到分类和区段划分,对不同区段定义不同的作用。

 

4 变量、结构

4-1:变量的定义遵循最小化、最短化原则。

4-2:变量的命名全部用小写;函数的命名首字母大写。

4-3:枚举的使用,一般定义为全局的。

4-4:局部变量,最小化方式定义。

示例:如下例子不符合规范。

例 1:

int i;

for (i=1; i<5; i++)

{

    ...

}

应如下书写

for (int i=1; i<5; i++)

{

    ...

}

4-5:类的命名:类定义一般首字母用C

示例:如下例子不符合规范

例:Class Player; Class _Player; Classplayer;

应如下书写

Class CPlayer

4-6:结构的定义:定义时有个统一的标识符,方便在类视图中查看。

示例(规范的书写):

typedef struct tagPlayInfo

{

    ...

}PLAYERINFO,*PPLAYERINFO;

 

5 函数、过程

5-1:全局函数:采用直接书写,不用下划线和前缀。

示例:如下例子不符合规范。

例1:stringgpGetModulepath();

例2:string_GetModulepath();

应如下书写

string GetModulepath();

5-2:拷贝构造函数:如果不需要拷贝构造函数,必须使用禁止拷贝构造函数。

5-3:函数的规模尽量限制在40行以内。

说明:不包括注释和空格行。

 

6 可测性

6-1:使用断言来发现软件问题,提高代码可测性。

说明:断言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),

它可以快速发现并定位问题,同时对错误进行自动报警。

6-2: 正常调用assert的书写。

示例:如下例子不符合规范。

例1:

bool MyClass::OnPlayerEnter(CPlayer* player)

{

    assert(player !=NULL);

    printf(“%s”, player->m_name);

}

应如下书写

bool MyClass::OnPlayerEnter(CPlayer* player)

{

    assert(player !=NULL);

    if (player ==NULL)

    {

        assert(0);

        LOGE(player point is NULL maybe, ); // 打印附近的变量(必须打印)

        return false; orreturn true;

    }

    printf(“%s”, player->m_name);

}

 

6-3:程序开发环境(windows/linux)中断言的使用。

说明: 服务器程序有windows和linux版本。在windows上编写的程序用的断言,要写个控制,当程序移植到linux上时,assert失效。因此,如果在windows上写linux上运行使用的程序时,使用断言需要写一个接口,实现在linux上运行断言的效果也实现。

 

7

7-1:使用#pragmaonce, 禁止使用#if def。

7-2:如果必须使用常量,使用宏定义的形式。

示例:(规范书写)

#define CORE_PI         3.14159265358979323846f

7-3:书写宏定义的位置规范。

说明:如果类里面用到宏,则定义到.h文件;如果是.cpp文件用到,则定义到.cpp文件。

7-4: 因为宏不受命名空间控制。如果要定义的宏可能已经被定义了,建议使用const。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值