c++编码规范

目录

一 编码规范的理解

二 排版风格

2.1 空格风格

2.3 一行只写一条语句

2.4 语句较长时分行

2.5 对齐问题

2.6 明确优先级

三 理解性

3.1 注释

四 命名


一 编码规范的理解

  • 对于编码规范这个东西,没有一个定式,主要是由于大型产品的开发通常由很多的人协同作战,如果不统一编程规范,最终合到一起的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。
  • 要知道并没有一种完美的代码规范,也没有固定不变的代码规范,这取决于开发团队,以及个人的爱好和习惯,但大部分的代码规范几乎都是相同的,如果你自己的代码规范非常好用,也可以把它用作为团队的编码标准。
  • 当然比如clang等工具是可以自动为代码配置编码规范的,但最好不要依赖这些软件。
  • 你可以这样理解,对于下面或者任何代码规范,都是为了简洁和方便开发人员的开发的交流。

二 排版风格

2.1 空格风格

  • 缩进为4个空格位。不要混合使用空格和TAB键。
  • 等号赋值,判断前后加空格。
  • 对于printf等参数,逗号后面加上空格。

if( a == 1 || b == 2)

{

    printf(“%d %d %d”, a, b, b);

}

  • 对于单目运算符号前后不加空格(自增自减,按位与,按位或,按位取反,取地址等符号。

int a = 10;

int b = ++a;

  • "->"、"."前后不加空格(类的成员变量访问这种有密切关联性的符号也不加空格)

p->id = pId; 

2.2 函数体

函数体的开始,类的定义,结构的定义,if、for、do、while、switch及case语句中的程序都应采用缩进方式,作用域的大括号都应该占一行并且位于同一列,同时与引用它们的语句左对齐

  • 作用域括号对齐

if ( ... ) 
{
    printf("这里要相对{}的位置缩进4个空格");
}

  • 功能相对独立的程序块,或函数体(for,if,while,switch)等语句前后应该加一行空格)

char *pContext;
int nIndex;
long lCounter;

pContext = new (CString);


if(pContext == NULL) 
{
    return FALSE;
}

  • if、while、for、case、default、do等语句自占一行。即使只有一行代码

if( pUserCR == NULL )
{
    return;
}

不应该写为

if(pUserCR == NULL) return;

2.3 一行只写一条语句

int a = 0;                                      

int b = 0;

int c = 0;

rect.length = 0 ;
rect.width = 0 ;

2.4 语句较长时分行

  • 若语句较长(多于80字符),可分成多行写,划分出的新行要进行适应的缩进,使排版整齐,语句可读。

memset(pData->pData + pData->nCount, 0,
(m_nMax - pData->nCount) * sizeof(LPVOID));

CNoTrackObject* pValue =
(CNoTrackObject*)_afxThreadData->GetThreadValue(m_nSlot);

for ( i = 0, j = 0 ; ( i < BufferKeyword[ WordIndex ].nWordLength )
&& ( j < NewKeyword.nWordLength ) ; i ++ , j ++ )

2.5 对齐问题

  • 结构体成员赋值,等号对齐

rect.top        = 0;
rect.left        = 0;
rect.right      = 300;
rect.bottom  = 200;

  • define的各个字段对齐,因为我们使用时关注的是前面的字段,而不是值。

#define GL_POINTS 0X0000

#define GL_LINE_LOOP 0X002

2.6 明确优先级

  • 在一些不同类型的操作符号混合使用时,使用括号给出优先级

if((year % 4) == 0 || ((year % 100) != 0 && (year % 400) == 0))

三 理解性

3.1 注释

  • 程序在必要的地方必须有注释,注释要准确、易懂、简洁。

例如如下注释意义不大。
/* 如果bReceiveFlag 为 TRUE */
if ( bReceiveFlag == TRUE)

而如下的注释则给出了额外有用的信息。
/* 如果mtp 从连接处获得一个消息*/
if ( bReceiveFlag == TURE)

  • 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

/*获得系统指针和网络指针的副本 */
nRepssnInd = SsnData[ index ].nRepssnIndex ;
nRepssnNi = SsnData[ index ].ni ;

  • 对于所有的常量,变量,数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。

/* 带原始用户信息的SCCP接口 */
enum SCCP_USER_PRIMITIVE
{
    N_UNITDATA_IND , /* 向SCCP用户报告单元数据已经到达 */
    N_UNITDATA_REQ , /* SCCP用户的单元数据发送请求 */
} ;

  • 头文件、源文件的头部,应进行注释。注释必须列出:文件名、作者、目的、功能、修改日志等。
/***********************************************

 项目名称(projectName):

 文件名(FileName):

 功能描述(Description):

 作者(Author):

 创建日期(Created Date):2023-09-20

 修改记录(Revision Record): 2024-09-22 取消方法。
                            2024-09-23 增加方法
 非通用缩写:(非必须)

 使用说明:(动态库时须在头文件给出)

***********************************************/
  •  函数头部应进行注释,列出:函数的目的、功能、输入参数、输出参数、修改日志等。
    /**************************
     * @brief  函数功能 目的    
     * @param  参数    
     * #param  参数
     * @return 返回值
     * @Log    修改日志 (一般不需要)
     *
     ***************************/
  • 仔细定义并明确公共变量的含义、作用、取值范围及使用方法。
    在对变量声明的同时,应对其含义、作用、取值范围及使用方法进行注释说明,同时若有必要还应说明与其它变量的关系。明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。
/* 含义: 系统全局配置
   作用: 获取系统配置,开关等
   取值范围: 全局
   使用方法: 需要引入某个头文件
*/
sys_base_info g_sysBaseInfo;

四 命名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值