华为C语言通用编程规范.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《华为C语言通用编程规范.docx》由会员分享,可在线阅读,更多相关《华为C语言通用编程规范.docx(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、章节内容0前言目的重点关注约定例外1原那么好代码的原那么类和函数设计指导原那么保证静态类型平安遵循C+ ISO标准优先编译时检查错误使用命名空间来限定作用域优先使用C+特性而 不是c特性2命名通用命名文件命名函数命名类型命名变量命名宏、常量、枚举命名3格式 行宽缩进大括号函数声明和定义函数调用if语句循环语句switch语句 表达式变量赋值初始化指针和引用编译预处理空格和空行类4注释注释风格文件头注释函数头注释代码注释5头文件头文件职责头文件依赖6作用域 命名空间全局函数和静态成员函数全局变量全局常量和静态成员常量7类构造、拷贝构造、赋值和析构函数继承多重继承重载8函数 函数设计内联函数函数参
2、数9 C+其常量与初始化表达式类型转换资源分配和释放标准库const的用法异常他特性 模板宏10现代 代码简洁性和平安性提升智能指针Lambda接口C+特性。前言目的规那么并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影 响。但是我们制定规那么的目的为了大多数程序员可以得到更多的好处 如果 在团队运作中认为某个规那么无法遵循,希望可以共同改进该规那么。参考该规范之前,希望您具有相应的C+基础能力,而不是通过该文档来学习C+。1 ,了解C+的ISO标准;2.熟知C+的基本语言特性,包括C+ 03/11/14/17相关特性;3.了解C+的标准库;重点关注约定C+的编程风格,比方
3、命名,排版等。1 C+的模块化设计,如何设计头文件,类,接口和函数。2 C+相关特性的优秀实践,比方常量,类型转换,资源管理,模板等。3 现代C+的优秀实践,包括C+11/14/17中可以提高代码可维护性,提高代 码可靠性的相关约定。class MyClass public:MyClass() : value(0) private: int value;;函数声明和定义规那么函数声明和定义的返回类型和函数名在同一行;函数参数列 表超出行宽时要换行并合理对齐在声明和定义函数的时候,函数的返回值类型应该和函数名在同一行;如果行宽度 允许,函数参数也应该放在一行;否那么,函数参数应该换行,并进行合理
4、对齐。参数列表的左圆括号总是和函数名在同一行,不要单独一行;右圆括号总是跟随最 后一个参数。换行举例:ReturnType FunctionName(ArgType paramNamel ArgType paramName2) / Good:全在同一行ReturnType VeryVeryVeryLongFunctionName(ArgType paramNamel/ 行宽不满足所有参数,进行换行ArgType paramNameZ.,/ Good:和上一行参数对齐ArgType paramName3) )ReturnType LongFunctionName(ArgType paramNam
5、el ArgType paramNameZ / 行宽限制,进行换行ArgType paramName3., ArgType paramName4j ArgType paramName5) / Good:换行后4空格缩进 )ReturnType Really Really Really Rea HyLongFunctionName(/ 行宽不满足第1个参数,直接换行ArgType paramNamel ArgType paramName2, ArgType paramName3) / Go od:换行后4空格缩进函数调用规那么函数调用入参列表应放在一行,超出行宽换行时,保持参数 进行合理对齐函数
6、调用时,函数参数列表放在一行。参数列表如果超过行宽,需要换行并进行合 理的参数对齐。左圆括号总是跟函数名,右圆括号总是跟最后一个参数。换行举例:ReturnType result = FunctionName(paramNamel., paramName2); / Good: 函 数参数放在一行/ Good:保/ Good:保/ Good:参/行宽不满/换行后,4ReturnType result = FunctionName(paramNamel paramName2 持与上方参数对齐paramName3);ReturnType result = FunctionName(paramName
7、lJ paramName2 paramName3j paramName4 paramName5);数换行,4空格缩进ReturnType result = VeryVeryVeryLongFunctionName( 足第1个参数,直接换行paramNamel paramName2, paramName3);空格缩进如果函数调用的参数存在内在关联性,按照可理解性优先于格式排版要求,对参数 进行合理分组换行。/ Good;每行的参数代表一组相关性较强的数据结构,放在一行便于理解一int result = DealWithStructureLikeParams(left .x., left.y/ 表
8、示一组的关参数一right.X, right.y); / 表示另外 一组相关参数if语句规那么3.6.1 if语句必须要使用大括号我们要求if语句都需要使用大括号,即便只有一条语句。理由:-代码逻辑直观,易读;-在已有条件语句代码上增加新代码时不容易出错;对于在if语句中使用函数式宏时,有大括号保护不易出错(如果宏定义时遗漏了 大括号)。if (objectlsNotExist) / Good:单行条件语句也加大括号return CreateNewObject();)规那么禁止if/else/else if写在同一行条件语句中,假设有多个分支,应该写在不同行。如下是正确的写法:if (some
9、Conditions) DoSomething(); else / Good: eLse 与 if 在不同行 )下面是不符合规范的案例:if (someConditions) else / Bad: eLse 与 if 在同一行循环语句规那么循环语句要求使用大括号和if语句类似,我们要求for/while循环语句必须加上的大括号,即使循环体是空 的,或者循环语句只有一条。for (int i = 0; i someRange; i+) DoSomething();)如果循环体是空的,应该使用空的大括号,而不是使用单个分号。单个分号容易 被遗漏,也容易被误认为是循环语句中的一局部。for (in
10、t i = 0; i someRange; i+) / Good: for 循环体是空,使用大 括号,而不是使用分号while (someCondition) / Good: while循环体是空,使用大括号,而不是使 用分号while (someCondition) continue; / Good: continue表示空逻辑,可以使用大括号也可以不使用)坏的例子:for (int i = 0; i threshold & / Good:换行后,逻辑操作符放在行尾 someConditionsion) DoSomething(); )int result = reallyReallyLon
11、gVariableNamel +/ GoodreallyReallyLongVariableName2;表达式换行后,注意保持合理对齐,或者4空格缩进。参考下面例子int sum = longVaribleNamel + longVaribleName2 + longVaribleName3 + longVaribleName4 + longVaribleName5 + longVaribleName6;/Good: 4空格缩进int sum = longVaribleNamel + longVaribleName2 + longVaribleName3 + longVaribleName4
12、+ longVaribleName5 + longVaribleName6; /Good:保持对齐变量赋值规那么多个变量定义和赋值语句不允许写在一行每行只有一个变量初始化的语句,更容易阅读和理解。int maxCount = 10;bool isCompleted = false;下面是不符合规范的例如:int maxCount = 10; bool isCompleted = false; / Bad:多个变量初始化需要分 开放在多行,每行一个变量初始化int x, y = 0; / Bad:多个变量定义需要分行,每行一个int pointX;int pointY; pointX = 1;
13、pointY = 2; / Bad:多个变量赋值语句放同一行例外:for循环头、if初始化语句(C+17) 结构化绑定语句(C+17)中可以声 明和初始化多个变量。这些语句中的多个变量声明有较强关联,如果强行分成多行 会带来作用域不一致,声明和初始化割裂等问题。初始化初始化包括结构体、联合体、及数组的初始化规那么初始化换行时要有缩进,并进行合理对齐结构体或数组初始化时,如果换行应保持4空格缩进。从可读性角度出发,选择 换行点和对齐位置。const int rank = 16, 16, 16, 16, 32, 32, 32, 32,64, 64, 64, 64, 32, 32, 32, 32;指
14、针与引用建议指针类型”跟随变量名或者类型,不要两边都留有或者都没有空格指针命名:*靠左靠右都可以,但是不要两边都有或者都没有空格。int* p = NULL; / Good int *p = NULL; / Good int*p = NULL; / Bad int * p = NULL; / Bad例外:当变量被const修饰时,钎无法跟随变量,此时也不要跟随类型。char * const VERSION = VlOO;建议引用类型&跟随变量名或者类型,不要两边都留有或者都没有空格引用命名:&靠左靠右都可以,但是不要两边都有或者都没有空格。int i = 8;/ Good/ Good/ Bad
15、/ Bad/ Good/ Good/ Bad/ Badint& p = i; int &p = i;int & p = i;int&p = i;编译预处理规那么编译预处理的“阴统一放在行首,嵌套编译预处理语句时,“# 不缩进编译预处理的“铲统一放在行首,即使编译预处理的代码是嵌入在函数体中的,# 也应该放在行首。#if defined( x86 64 ) & defined( GCC HAVE SYNC COMPARE AND SWAP 16)/ Good:放在行首#define ATONIIC_X86_HAS_CMPXCHG16B 1 / Good: “井”放在行首#else#define
16、ATONIIC_X86_HAS_CMPXCHG16B 0#endifint FunctionName() if (someThingError) / Good:即便在函数内部,斯”也放在行首#ifdef HAS_SYSLOG WriteToSysLog();#elseWriteToFileLog();#endif ) )内嵌的预处理语句“ # 不缩进#if definedf x86 64 ) & defined( GCC HAVE SYNC COMPARE AND SWAP 16) ttdefine AT0MIC_X86_HAS_CMPXCHG16B 1 / Good:区分层次,便于阅读 #e
17、lse#define AT0MIC_X86_HAS_CMPXCHG16B 0#endif空格和空行建议水平空格应该突出关键字和重要信息,防止不必要的留白水平空格应该突出关键字和重要信息,每行代码尾部不要加空格。总体规那么如下: if, switch, case, do, while, for 等关键字之后加空格;小括号内部的两侧,不要加空格; 大括号内部两侧有无空格,左右必须保持一致;一元操作符(&* + -!)之后不要加空格; 二元操作符(= + -*/% |&A =!=)左右两侧加空格三目运算符(?:)符号两侧均需要空格 前置和后置的自增、自减(+-)和变量之间不加空格结构体成员操作符(.
18、,)前后不加空格 逗号C)前面不加空格,后面增加空格对于模板和类型转换(v)和类型之间不要添加空格 域操作符(:)前后不要添加空格冒号(:)前后根据情况来判断是否要添加空格常规情况:void Foo(int b) / Good:大括号前应该留空格 int i = 0; / Good:变量初始化时,=前后应该有空格,分号前面不要留空格int bufkBufSize = 0;/ Good:大括号内两侧都无空格函数定义和函数调用: int result = Foo(arglJarg2);A / Bad:逗号后面需要增加空格int result = Foo( argl arg2 );AA /Bad:函
19、数参数列表的左括号后面不应该有空格,右括号前面不应该有空格指针和取地址x = *p;/ Good: *操作符和指针p之间不加空格p=&x;/ Good: &操作符和变量x之间不加空格x =r.y; / Good:通过.访问成员变量时不加空格义= r-y; / Good:通过- 访问成员变量时不加空格操作符:x = 0;/ Good:赋值操作的 =前后都要加空格x = -5;/ Good:负数的符号和数值之前不要加空格+x;/ Good:刖置和后置的+/-和变量之间不要加空格X-; if (x & !y) / Good:布尔操作符前后要加上空格,!操作和变量之间不要空格v = w*x + y/z
20、; / Good:二元操作符前后要加空格v = w * (x + z);/ Good:括号内的表达式前后不需要加空格int a = (x y) ? x : y; / Good:三目运算符,?和:前后需要添加空格循环和条件语句:if (condition) / Good:讨关键字和括号之间加空格,括号内条件语句前后不加 空格 else / Good: else关键字和大括号之间加空格 )while (condition) / Good: lAihiLe关键字和括号之间加空格,括号内条件语句前后不加空格for (int i = 0; i )不与空格紧邻, 和(之间也没有. vector x;y =
21、 static_cast(x);/在类型与指针操作符之间留空格也可以,但要保持一致.vector x;域操作符std: :cout; / Good:命名空间访问,不要留空格int MyClass: :GetValue() const / Good:对于成员函数定义,不要留空格 冒号/添加空格的场景/ Good:类的派生需要留有空格class Sub : public Base ;/构造函数初始化列表需要留有空格MyClass:MyClass(int var) : someVar(var) DoSomething();)/位域表示也留有空格struct XX char a :4; char b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为C 语言通用编程规范 华为 语言 通用 编程 规范
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内