华为C++语言通用编程规范
华为的编程规范和范例
目录
1 排版6
2 注释11
3 标识符命名18
4 可读性20
5 变量、结构22
6 函数、过程28
7 可测性36
8 程序效率40
9 质量保证44
10 代码编辑、编译、审查50
11 代码测试、维护52
12 宏53
1 排版
¹1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
¹1-2:相对独立的程序块之间、变量说明之后必须加空行。
示例:如下例子不符合规范。
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
应如下书写
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
¹1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied
华为C语言编程规范
void example_fun( void ) { ... // program code } ¹1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或 者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空 格。 说明:采用这种松散方式编写代码的目的是使代码更加清晰。 由于留空格所产生的清晰性是相对的, 所以, 在已经非常清晰的语句中没有必要再留空格, 如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格, 多重括号间 不必加空格,因为在 C/C++语言中括号已经是最清晰的标志了。 在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给 操作符留空格时不要连续留两个以上空格。
<author> <time> David 96/10/12
build this moudle
***********************************************************/ 说明:Description 一项描述本文件的内容、功能、内部各部分之间的关系及本文件与 其它文件关系等。History 是修改历史记录列表,每条修改记录应包括修改日期、修改 者及修改内容简述。 ¹2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用 关系(函数、表)等。 示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含 在内。 /************************************************* Function: Description: Calls: Called By: // 函数名称 // 函数功能、性能等的描述 // 被本函数调用的函数清单 // 调用本函数的函数清单
华为公司编程规范和范例(C++)
目录
1 排版 6
2 注释11
3 标识符命名18
4 可读性20
5 变量、结构22
6 函数、过程28
7 可测性36
8 程序效率40
9 质量保证44
10 代码编辑、编译、审查50
11 代码测试、维护52
12 宏53
1 排版
¹1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
¹1-2:相对独立的程序块之间、变量说明之后必须加空行。
示例:如下例子不符合规范。
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
应如下书写
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
¹1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied
华为C++语言通用编程规范.pdf
保证静态类型安全
我们希望 C++应该是静态类型安全的,这样可以减少运行时的错误,提高代码的健 壮性。但是由于 C++的下面的特性存在,会破坏 C++静态类型安全,我们针对这部 分特性要仔细处理。 - unions 联合体 - 类型转换 cast - 缩窄转换 narrowing conversions - 类型退化 type decay - 范围错误 range errors - void*类型指针
0 前言
目的
规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影 响。但是我们制定规则的目的__“为了大多数程序员可以得到更多的好处”__, 如果 在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。
参考该规范之前,希望您具有相应的 C++基础能力,而不是通过该文档来学习 C++。 1. 了解 C++的 ISO 标准; 2. 熟知 C++的基本语言特性,包括 C++ 03/11/14/17 相 关特性; 3. 了解 C++的标准库;
在不违背总体原则,经过充分考虑,有充足的理由的前提下,可以适当违背规范中 约定。 例外破坏了代码的一致性,请尽量避免。’规则’的例外应该是极少的。
下列情况,应风格一致性原则优先: 修改外部开源代码、第三方代码时,应该遵守开源代码、第三方代码已有规范, 保持风格统一。 某些特定领域,优先参考其行业规范。
华为公司编程语法规范
目录
1 排版 6
2 注释11
3 标识符命名18
4 可读性20
5 变量、结构22
6 函数、过程28
7 可测性36
8 程序效率40
9 质量保证44
10 代码编辑、编译、审查50
11 代码测试、维护52
12 宏53
1 排版
¹1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
¹1-2:相对独立的程序块之间、变量说明之后必须加空行。
示例:如下例子不符合规范。
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
应如下书写
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
¹1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied = stat_poi[index].occupied;
华为技术 公司C 语言编程规范
C++语言编程规范
内部公开
本规范拟制与解释部门:
修订声明
本规范的相关系列规范或文件: 相关国际规范或文件一致性: 替代或作废的其它规范或文件: 相关规范或文件的相互关系:
规范号
主要起草部门专家
主要评审部门专家
DKBAxxxx.x-xxxx.xx
研发能力中心系统工程 研发能力中心:
部:
郭永生00120218 张建保00116237
3 函数 ..................................................... 12
3.1 内联函数.............................................................................................................................12 3.2 函数参数.............................................................................................................................13 3.3 函数指针.............................................................................................................................14
C_C++编程规范-华为标准-精
查。 7-12:正式软件产品中应把断言及其它调测代码去掉(即把有关的调
测开关关掉)。 7-13:在软件系统中设wk.baidu.com与取消有关测试手段,不能对软件实现的功
后进入下一个case处理,必须在该case语句处理完、下一个case语句前加 上明确的注释。
编程规范详解——标识符的命名
3-1:标识符的命名要清晰、明了,有明确含义,同时使用完 整的单词或大家基本可以理解的缩写,避免使人产生误解。
3-2:命名中若使用特殊约定或缩写,则要有注释说明 3-3:自己特有的命名风格,要自始至终保持一致,不可来回
值范围及公共变量间的关系。 5-3:明确公共变量与操作此公共变量的函数或过
程的关系,如访问、修改及创建等。 5-4:当向公共变量传递数据时,要十分小心,防
止赋与不合理的值或越界等现象发生。 5-5:防止局部变量与公共变量同名。 5-6:严禁使用未经初始化的变量作为右值。
编程规范详解——函数、过程
6-1:对所调用函数的错误返回码要仔细、全面地 处理。
延用华为标准
C/C++编程规范
编程规范详解——排版
华为CC语言编程规范
百度文库- 让每个人平等地提升自我
目录
1 排版 (2)
4 可读性 (11)
6 函数、过程 (13)
7 可测性 (14)
1 排版
¹1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
¹1-2:相对独立的程序块之间、变量说明之后必须加空行。
示例:如下例子不符合规范。
if (!valid_ni(ni))
{
... epssn_index;
repssn_ni = ssn_data[index].ni;
应如下书写
if (!valid_ni(ni))
{
... epssn_index;
repssn_ni = ssn_data[index].ni;
¹1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
= NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER +
index].occupied
= stat_poi[index].occupied;
act_task_table[taskno].duration_true_or_false
= SYS_get_sccp_statistic_state( stat_item );
report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)
华为技术有限公司C语言编程规范
修订声明Revision declaration
本规范拟制与解释部门:
本规范的相关系列规范或文件: 相关国际规范或文件一致性: 替代或作废的其它规范或文件: 相关规范或文件的相互关系:
规范号 DKBAxxxx.x-xxxx.xx
主要起草部门专家 PSST质量部: 郭曙光00121837 网络: 张伟00118807 周灿00056781 王晶00041937 陈艺彪00036913 IP开发部: 薛治00038309 核心网: 张小林00058208 王德喜00040674 李明胜00042021 软件公司: 文 滔00119601 无线: 刘爱华00162172 中研: 谭洪00162654
修订情况
2011-11-16
来自百度文库
华为机密,未经许可不得扩散 Huawei Confidential 第2页,共61页Page 2 , Total61
密级:内部公开DKBA 2826-2011.5
目 录Table of Contents
0 规范制订说明 ................................................................................................................................ 5 0.1 前言 ...................................................................................................................................... 5 0.2 代码总体原则 ....................................................................................................................... 5 0.3 规范实施、解释....................................................................................................................6 0.4 术语定义...............................................................................................................................6 1 头文件 ........................................................................................................................................... 6 2 函数.............................................................................................................................................12 3 标识符命名与定义 ....................................................................................................................... 21 3.1 通用命名规则 ..................................................................................................................... 21 3.2 文件命名规则 ..................................................................................................................... 23 3.3 变量命名规则 ..................................................................................................................... 23 3.4 函数命名规则 ..................................................................................................................... 24 3.5 宏的命名规则 ..................................................................................................................... 24 4 变量.............................................................................................................................................25 5 宏、常量...................................................................................................................................... 28 6 质量保证...................................................................................................................................... 32 7 程序效率...................................................................................................................................... 36 8 注释.............................................................................................................................................39 9 排版与格式 .................................................................................................................................. 44 10 表达式.....................................................................................................................................46 11 代码编辑、编译 ...................................................................................................................... 49 12 可测性.....................................................................................................................................50 13 安全性.....................................................................................................................................51 13.1 字符串操作安全..................................................................................................................51 13.2 整数安全.............................................................................................................................52 13.3 格式化输出安全..................................................................................................................56 13.4 文件I/O安全........................................................................................................................57 13.5 其它 .................................................................................................................................... 59 14 单元测试 ................................................................................................................................. 59 15 可移植性 ................................................................................................................................. 60 16 业界编程规范..........................................................................................................................60
华为的编程规范和范例
目录
1 排版6
2 注释11
3 标识符命名18
4 可读性20
5 变量、结构22
6 函数、过程28
7 可测性36
8 程序效率40
9 质量保证44
10 代码编辑、编译、审查50
11 代码测试、维护52
12 宏53
1 排版
¹1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
¹1-2:相对独立的程序块之间、变量说明之后必须加空行。
示例:如下例子不符合规范。
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
应如下书写
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
¹1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied
华为编程规范
华为编程规范
华为编程规范是指在华为公司内部进行软件开发时所遵守的一套规范和标准,旨在提高代码的质量和可维护性。下面是华为编程规范的主要内容。
一、命名规范:
1. 变量和函数名应采用有意义的名称,尽量避免使用缩写或简写。
2. 变量名和函数名应使用小驼峰命名法,即首字母小写,后续单词首字母大写。
3. 常量名应使用大写字母和下划线,以增加可读性。
4. 类名应使用大驼峰命名法,即每个单词首字母大写。
5. 文件名应与其中的公共类名一致。
二、注释规范:
1. 在每个函数的开头添加函数的功能说明,参数说明和返回值说明。
2. 在关键性代码部分添加注释,说明代码的逻辑。
3. 在需要修正或改进的代码部分添加TODO注释,以便后续修复。
三、代码风格:
1. 缩进使用4个空格而不是Tab键。
2. 每行代码的长度不能超过80个字符。
3. 在二元操作符两边添加空格,例如 a + b。
4. 大括号应另起一行,不应与关键字在同一行。
5. 每个语句结束后都应该添加分号。
四、异常处理:
1. 捕获异常时应尽量具体,不应捕获顶层异常。
2. 异常处理代码应与正常逻辑代码分离,以提高代码的可读性。
3. 异常处理代码块应添加注释,说明捕获的异常类型和处理的方法。
五、函数规范:
1. 函数的长度应控制在100行以内,避免函数过长和复杂。
2. 函数的参数应尽量少,可以通过封装成结构体或类的方式来减少参数数量。
3. 函数应只完成一个功能,不应既完成数据处理又完成界面显示等功能。
六、代码复用:
1. 尽量使用现有的类和框架来实现功能,避免重复造轮子。
华为C++语言通用编程规范.pdf
C++比起 C 语言更加类型安全,更加抽象。我们更推荐使用 C++的语言特性来编程, 比如使用 string 而不是 char*, 使用 vector 而不是原生数组,使用 namespace 而不 是 static。
2 命名
通用命名
常见命名风格有: 驼峰风格(CamelCase) 大小写字母混用,单词连在一起,不同 单词间通过单词首字母大写来分开。 按连接后的首字母是否大写,又分: 大驼峰 (UperCamelCase)和小驼峰(lowerCamelCase)
k+大小写混合 大写+下划线 全小写
注意: 上表中__常量__是指全局作用域、namespace 域、类的静态成员域下,以 const 或 constexpr 修饰的基本数据类型、枚举、字符串类型的变量。 上表中__变 量__是指除常量定义以外的其他变量,均使用小驼峰风格。
文件命名
建议 2.2.1 C++文件以.cpp 结尾,头文件以.h 结尾
建议 2.2.2 C++文件名和类名保持一致
C++的头文件和 cpp 文件名和类名保持一致,使用下划线小写风格。
如下: - database_connection.h - database_connection.cpp
华为C语言编程规范总则
应如下书写 if (!valid_ni(ni)) {
... // program code }
repssn_ind = ssn_data[index].repssn_index; repssn_ni = ssn_data[index].ni;
1-9:一行程序以小于 80 字符为宜,不要写得过长。
2 注释
2-1:一般情况下,源程序有效注释量必须在
20%以上。
说明: 注释的原则是有助于对程序的阅读理解, 在该加的地方都加了,
太少,注释语言必须准确、易懂、简洁。
注释不宜太多也不能
2-2:文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、 功能、修改日志等。 示例:下面这段头文件的头注释比较标准,当然, 并不局限于此格式,但上述信息建议要包 含在内。
1-7:函数或过程的开始、 结构的定义及循环、 判断等语句中的代码都要采用缩进风格, 语句下的情况处理语句也要遵从语句缩进要求。
case
1-8:程序块的分界符 (如 C/C++ 语言的大括号 ‘ {’和‘ }’)应各独占一行并且位于同一列, 同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以 及 if、 for、 do、 while、 switch、 case语句中的程序都要采用如上的缩进方式。
华为c语言编程规范
华为c语言编程规范
华为C语言编程规范
1. 命名规范:
- 变量、函数、宏名使用小写字母和下划线的组合,如:int my_variable;
- 宏名全部大写,并用下划线分隔单词,如:#define
MAX_NUM 100;
- 结构体命名使用大驼峰命名法,如:typedef struct MyStruct; - 文件名使用小写字母和下划线的组合,如:my_file.c;
2. 缩进与换行:
- 使用4个空格进行缩进,不使用Tab键;
- 换行时,尽量将操作符放在新行开头,如:a = b +
c;
- if、for、while等关键字后的括号与关键字之间不换行;
- 如果一行超过80个字符,应该进行换行;
3. 注释规范:
- 使用//进行单行注释;
- 使用/**/进行多行注释;
- 对代码的重点或逻辑进行注释,并保持注释和代码同步更新;
- 不使用无意义的注释;
4. 函数与变量规范:
- 函数应该具有明确的功能,并使用动词开头;
- 变量必须在使用前进行声明,并尽量减少全局变量的使用; - 变量名应该具有描述性,并易于理解;
- 不要使用具有歧义或过于简单的变量名;
- 变量应该在定义的同时初始化;
5. 语法与逻辑规范:
- 不要在一个语句中定义多个变量;
- 避免使用goto语句;
- 比较变量和常量时,应该将变量放在前面,如:if (x == 0); - 不要使用宏定义来替换函数,除非替换后代码不被执行;
- 返回值应该使用明确的类型,避免使用int类型表示布尔值; - 使用语言提供的错误处理机制,不要使用全局变量进行错
华为技术有限公司C++语言编程规范
11.1 标示符命名与定义 .............................................................................................................. 48 11.2 排版 .................................................................................................................................... 48 11.3 注释 .................................................................................................................................... 49 11.4 文件组织.............................................................................................................................49
邓春平00036632 胡小翔00160924
赵祎00108293
李玉华39860
邓赛兵00101270
C_C++编程规范-华为标准-精
编程规范详解——可读性
4-1:注意运算符的优先级,并用括号明确表达 式的操作顺序,避免使用默认优先级。
4-2:避免使用不易理解的数字,用有意义的标 识来替代。涉及物理状态或者含有物理意义的 常量,不应直接使用数字,必须用有意义的枚 举或宏来代替。
编程规范详解——变量
5-1:去掉没必要的公共变量。 5-2:仔细定义并明确公共变量的含义、作用、取
2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或 过程存取它以及存取时注意事项等的说明。
2-12:注释与所描述内容进行同样的缩排。 2-13:将注释与其上面的代码用空行隔开。 2-14:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。 2-15:对于switch语句下的case语句,如果因为特殊情况需要处理完一个case
10-1:打开编译器的所有告警开关对程序进行编 译。
10-2:在产品软件(项目组)中,要统一编译开 关选项。
10-3:通过代码走读及审查方式对代码进行检查。
编程规范详解——代码测试、维护
11-1:单元测试要求至少达到语句覆盖。 11-2:单元测试开始要跟踪每一条语句,并观察数
据流及变量的变化。 11-3:清理、整理或优化后的代码要经过审查及测
编程规范详解——注释
2-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在 声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在 其上方相邻位置或右方。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
匈牙利风格 在‘大驼峰’的基础上,加上前缀;前缀用于表达类型或用途。 如: ‘uiSavedCount’, ‘bTested’
规则 2.1.1 标识符命名使用驼峰风格
不考虑匈牙利命名,在内核风格与驼峰风格之间,根据存量代码的情况,我们选择 驼峰风格。
1 原则
好代码的原则
我们参考 Kent Beck 的简单设计四原则来指导我们的如何写出优秀的代码,如何有 效地判断我们的代码是优秀的。 1. 通过所有测试(Passes its tests) 2. 尽可能消除 重复 (Minimizes duplication) 3. 尽可能清晰表达 (Maximizes clarity) 4. 更少代码元 素 (Has fewer elements) 5. 以上四个原则的重要程度依次降低。 这组定义被称做简 单设计原则。
Βιβλιοθήκη Baidu定
规则:编程时必须遵守的约定(must)
建议:编程时应该遵守的约定(should)
本规范适用通用 C++标准, 如果没有特定的标准版本,适用所有的版本 (C++03/11/14/17)。
例外
无论是’规则’还是’建议’,都必须理解该条目这么规定的原因,并努力遵守。 但是, 有些规则和建议可能会有例外。
我们可以通过约束这些特性的使用,或者使用 C++的新特性,比如 variant(C++17), GSL 的 span,narrow_cast 等来解决这些问题,提高 C++代码的健壮性。
遵循 C++ ISO 标准
希望通过使用 ISO C++标准的特性来编写 C++代码,对于 ISO 标准中未定义的或者 编译器实现的特性要谨慎使用,对于 GCC 等编译器的提供的扩展特性也需要谨慎 使用,这些特性会导致代码的可移植性比较差。
};
namespace utils { void DeleteUser(); }
类型命名
类型命名采用大驼峰命名风格。 所有类型命名——类、结构体、联合体、类型定 义(typedef)、枚举——使用相同约定,例如:
// classes, structs and unions class UrlTable { ... class UrlTableTester { ... struct UrlTableProperties { ... union Packet { ...
章节 0 前言 1 原则
2 命名 3 格式
4 注释 5 头文件 6 作用域 7类 8 函数 9 C++其 他特性 10 现代 C++特性
内容 目的 重点关注 约定 例外 好代码的原则 类和函数设计指导原则 保证静态类型安全 遵循 C++ ISO 标准 优先编译时检查错误 使用命名空间来限定作用域 优先使用 C++特 性而不是 C 特性 通用命名 文件命名 函数命名 类型命名 变量命名 宏、常量、枚举命名 行宽 缩进 大括号 函数声明和定义 函数调用 if 语句 循环语句 switch 语 句 表达式 变量赋值 初始化 指针和引用 编译预处理 空格和空行 类 注释风格 文件头注释 函数头注释 代码注释 头文件职责 头文件依赖 命名空间 全局函数和静态成员函数 全局变量 全局常量和静态成员常量 构造、拷贝构造、赋值和析构函数 继承 多重继承 重载 函数设计 内联函数 函数参数 常量与初始化 表达式 类型转换 资源分配和释放 标准库 const 的用法 异 常 模板 宏 代码简洁性和安全性提升 智能指针 Lambda 接口
第一条强调的是外部需求,这是代码实现最重要的;第二点就是代码的模块架构设 计,保证代码的正交性,保证代码更容易修改;第三点是代码的可阅读性,保证代 码是容易阅读的;最后一点才是保证代码是简洁的,在简洁和表达力之间,我们更 看重表达力。
类和函数设计指导原则
C++是典型的面向对象编程语言,软件工程界已经有很多 OOP 原则来指导我们编 写大规模的,高可扩展的,可维护性的代码: - 高内聚,低耦合的基本原则 SOLID 原则 - 迪米特法则 - “Tell,Don’t ask”原则 - 组合/聚合复用原则
VOS_UINTPTR; VOS_UINTPTR;
如果模块为了封装某个类型的信息,方便后续的扩展,可以使用 typedef 来重新定 义。
类型 类类型,结构体类型,枚举类型,联合体类型等类型定 义 函数(包括全局函数,作用域函数,成员函数)
全局变量(包括全局和命名空间域下的变量,类静态变 量),局部变量,函数参数,类、结构体和联合体中的成 员变量 常量(const),枚举值 宏 命名空间
命名风格 大驼峰
大驼峰(接口部分可加 前缀,如 XXX_函数 名) 小驼峰
保证静态类型安全
我们希望 C++应该是静态类型安全的,这样可以减少运行时的错误,提高代码的健 壮性。但是由于 C++的下面的特性存在,会破坏 C++静态类型安全,我们针对这部 分特性要仔细处理。 - unions 联合体 - 类型转换 cast - 缩窄转换 narrowing conversions - 类型退化 type decay - 范围错误 range errors - void*类型指针
命名空间将作用域细分为独立的,具名的作用域,可有效地防止全局作用域的命名 冲突。 1. class,struct 等都具有自己的类作用域。 2. 具名的 namespace 可以实现 类作用域更上层的作用域。 3. 匿名 namespace 和 static 可以实现文件作用域。
对于没有作用域的宏变量,宏函数强烈建议不使用。
建议 2.2.2 C++文件名和类名保持一致
C++的头文件和 cpp 文件名和类名保持一致,使用下划线小写风格。
如下: - database_connection.h - database_connection.cpp
结构体,命名空间,枚举等定义的文件名类似。
函数命名
函数命名统一使用大驼峰风格,一般采用动词或者动宾结构。接口部分可加前缀, 如 XXX_函数名。
// typedefs typedef std::map<std::string, UrlTableProperties*> PropertiesMap;
// enums enum UrlTableErrors { ...
对于命名空间的命名,建议全小写:
// namespace namespace osutils {
注意:如果模块中需要使用相关的扩展特性来,那么尽可能将这些特性封装成独立 的接口,并且可以通过编译选项关闭或者编译这些特性。对于这些扩展特性的使用, 请模块制定特性编程指南来指导这些特性的使用。
优先编译时检查错误
通过编译器来优先保证代码健壮性,而不是通过编写错误处理代码来处理编译就可 以发现的异常,比如:
在不违背总体原则,经过充分考虑,有充足的理由的前提下,可以适当违背规范中 约定。 例外破坏了代码的一致性,请尽量避免。’规则’的例外应该是极少的。
下列情况,应风格一致性原则优先: 修改外部开源代码、第三方代码时,应该遵守开源代码、第三方代码已有规范, 保持风格统一。 某些特定领域,优先参考其行业规范。
uint8_t
宽度恰为 8 的有/无符号整数类型
int16_t
uint16_t 宽度恰为 16 的有/无符号整数类型
int32_t
uint32_t 宽度恰为 32 的有/无符号整数类型
int64_t
uint64_t 宽度恰为 64 的有/无符号整数类型
intptr_t
uintptr_t 足以保存指针的有/无符号整数类型
重点关注
1. 约定 C++的编程风格,比如命名,排版等。 2. C++的模块化设计,如何设计头文件,类,接口和函数。 3. C++相关特性的优秀实践,比如常量,类型转换,资源管理,模板等。 4. 现代 C++的优秀实践,包括 C++11/14/17 中可以提高代码可维护性,提高代
码可靠性的相关约定。
0 前言
目的
规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影 响。但是我们制定规则的目的__“为了大多数程序员可以得到更多的好处”__, 如果 在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。
参考该规范之前,希望您具有相应的 C++基础能力,而不是通过该文档来学习 C++。 1. 了解 C++的 ISO 标准; 2. 熟知 C++的基本语言特性,包括 C++ 03/11/14/17 相 关特性; 3. 了解 C++的标准库;
k+大小写混合 大写+下划线 全小写
注意: 上表中__常量__是指全局作用域、namespace 域、类的静态成员域下,以 const 或 constexpr 修饰的基本数据类型、枚举、字符串类型的变量。 上表中__变 量__是指除常量定义以外的其他变量,均使用小驼峰风格。
文件命名
建议 2.2.1 C++文件以.cpp 结尾,头文件以.h 结尾
优先使用 C++特性而不是 C 特性
C++比起 C 语言更加类型安全,更加抽象。我们更推荐使用 C++的语言特性来编程, 比如使用 string 而不是 char*, 使用 vector 而不是原生数组,使用 namespace 而不 是 static。
2 命名
通用命名
常见命名风格有: 驼峰风格(CamelCase) 大小写字母混用,单词连在一起,不同 单词间通过单词首字母大写来分开。 按连接后的首字母是否大写,又分: 大驼峰 (UperCamelCase)和小驼峰(lowerCamelCase)
namespace fileutils {
}
}
建议 2.4.1 避免滥用 typedef 或者#define 对基本类型起别名
除有明确的必要性,否则不要用 typedef/#define 对基本数据类型进行重定义。 优 先使用<cstdint>头文件中的基本类型:
有符号类型 无符号类型 描述
int8_t
class List { public: void AddElement(const Element& element); Element GetElement(const unsigned int index) const; bool IsEmpty() const; bool MCC_GetClass();
• 通过 const 来保证数据的不变性,防止数据被无意修改。 • 通过 gsl::span 等来保证 char 数组不越界,而不是通过运行时的 length 检查。 • 通过 static_assert 来进行编译时检查。
使用命名空间来限定作用域
全局变量,全局常量和全局类型定义由于都属于全局作用域,在项目中,使用第三 方库中容易出现冲突。
我们推荐使用.h 作为头文件的后缀,这样头文件可以直接兼容 C 和 C++。 我们推 荐使用.cpp 作为实现文件的后缀,这样可以直接区分 C++代码,而不是 C 代码。
目前业界还有一些其他的后缀的表示方法:
• 头文件: .hh, .hpp, .hxx • cpp 文件:.cc, .cxx, .C
对于本文档,我们默认使用.h 和.cpp 作为后缀。
如果模块有自己的定义,请使用统一的 typedef 来定义类型:
typedef signed char VOS_INT8; typedef unsigned char VOS_UINT8;
#if __WORDSIZE == 64 typedef unsigned long int #else typedef unsigned int #endif
作用域的一些缺点: 1. 虽然可以通过作用域来区分两个命名相同的类型,但是还 是具有迷惑性。 2. 内联命名空间会让命名空间内部的成员摆脱限制,让人迷惑。 3. 通过多重嵌套来定义 namespace,会让完整的命名空间比较冗长。
所以,我们使用命名空间的建议如下: - 对于变量,常量和类型定义尽可能使用 namespace,减少全局作用域的冲突 - 不要在头文件中使用 using namespace - 不要 使用内联命名空间 - 鼓励在.cpp 文件中通过匿名 namespace 或者 static 来封装, 防止不必要的定义通过 API 暴露出去。