目录
一 编码规范的理解
- 对于编码规范这个东西,没有一个定式,主要是由于大型产品的开发通常由很多的人协同作战,如果不统一编程规范,最终合到一起的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。
- 要知道并没有一种完美的代码规范,也没有固定不变的代码规范,这取决于开发团队,以及个人的爱好和习惯,但大部分的代码规范几乎都是相同的,如果你自己的代码规范非常好用,也可以把它用作为团队的编码标准。
- 当然比如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;