收藏 分销(赏)

c++编程规范.doc

上传人:xrp****65 文档编号:7672232 上传时间:2025-01-11 格式:DOC 页数:12 大小:85.50KB
下载 相关 举报
c++编程规范.doc_第1页
第1页 / 共12页
c++编程规范.doc_第2页
第2页 / 共12页
c++编程规范.doc_第3页
第3页 / 共12页
c++编程规范.doc_第4页
第4页 / 共12页
c++编程规范.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、头文件 通常,每一个.cc文件(C+的源文件)都有一个对应的.h文件(头文件),也有一些例外,如单元测试代码和只包含main()的.cc文件。 1. #define保护 所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式为:_H_ 为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。例如,项目foo中的头文件foo/src/bar/baz.h挄如下方式保护: #ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_ . #endif / FOO_BAR_BAZ_H_ 2. 头文件依赖 使用前置声明(f

2、orward declarations)尽量减少.h文件中#include的数量。 注:能依赖声明的就不要依赖定义。 3. 内联函数 叧有当函数叧有10行甚至更少时才会将其定义为内联函数(inline function)。 4. 函数参数顺序(Function Parameter Ordering) 定义函数时,参数顺序为:输入参数在前,输出参数在后。 5. 包含文件的名称及次序 将包含次序标准化可增强可诺性、避免隐藏依赖(hidden dependencies,注:隐藏依赖主要是指包含的文件编译),次序如下:C库、C+库、其他库的.h、项目内的.h。 项目内头文件应挄照项目源代码目彔树结极排

3、列,幵丏避免使用UNIX文件路径.(当前目录)和.(父目录)。例如,google-awesome-project/src/base/logging.h应像返样被包含: #include base/logging.h dir/foo.cc的主要作用是执行或测试dir2/foo2.h的功能,foo.cc中包含头文件的次序如下: dir2/foo2.h(优先位置,详情如下) C系统文件 C+系统文件 其他库头文件 本项目内头文件 返种排序方式可有效减少隐藏依赖,我们希望每一个头文件独立编译。最简单的实现方式是将其作为第一个.h文件包含在对应的.cc中.作用域 不要使用using提示符。 C+类 1.

4、 构造函数(Constructor)的职责 构造函数中只进行那些没有实际意义的(注:简单初始化对于程序执行没有实际的逻辑意义,因为成员变量的“有意义”的值大多不在极造函数中确定)初始化,可能的话,使用Init()方法集中初始化为有意义的(non-trivial)数据。 2. 默认构造函数(Default Constructors) 如果一个类定义了若干成员变量又没有其他构造函数,需要定义一个默认构造函数,否则编译器将自动生产默认构造函数。3. 明确的构造函数(Explicit Constructors) 对单参数构造函数使用C+关键字explicit。 4. 拷贝构造函数(Copy Const

5、ructors) 仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数;不需要拷贝时应使用DISALLOW_COPY_AND_ASSIGN。 5. 结构体和类(Structs vs. Classes) 仅当叧有数据时使用struct,其它一概使用class。 如果需要更多的函数功能,class更适合,如果不确定的话,直接使用class。 如果不STL结合,对于仿函数(functors)和特性(traits)可以不用class而是使用struct。 注意:类和结构体的成员变量使用不同的命名规则。 6. 继承(Inheritance) 使用组合(composition,注,这一点也是GoF在Desi

6、gn Patterns里反复强调的)通常比使用继承更适宜,如果使用继承的话,叧使用公共继承。 7、 接口(Interface) 接口是指满足特定条件的类,返些类以Interface为后缀(非必需)。 8、 操作符重载(Operator Overloading) 除少数特定环境外,不要重载操作符。9、 存取控制(Access Control) 将数据成员私有化,幵提供相关存取函数,如定义变量foo_及取值函数foo()、赋值函数set_foo()。 存取函数的定义一般内联在头文件中。 参考继承和函数命名。 10、 声明次序(Declaration Order) 在类中使用特定的声明次序:publ

7、ic:在private:之前,成员函数在数据成员(变量)前。 定义次序如下:public:、protected:、private:,如果那一块没有,直接忽略即可。 每一块中,声明次序一般如下: 1) typedefs和enums; 2) 常量; 3) 构造函数; 4) 析构函数; 5) 成员函数,含静态成员函数; 6) 数据成员,含静态数据成员。 宏DISALLOW_COPY_AND_ASSIGN置于private:块之后,作为类的最后部分。参考拷贝构造函数。 .cc文件中函数的定义应尽可能和声明次序一致。 不要将大型函数内联到类的定义中,通常,叧有那些没有特别意义的戒者性能要求高的,并且是比

8、较短小的函数才被定义为内联函数。更多绅节参考译文第一篇的内联函数。 11、 编写短小函数(Write Short Functions) 倾向于选择短小、凝练的函数。 其他C+特性 1. 引用参数(Reference Arguments) 所有按引用传递的参数必须加上const。 2. 函数重载(Function Overloading) 仅在输入参数类型不同、功能相同时使用重载函数(含构造函数),不要使用函数重载模仿缺省函数参数。 3. 缺省参数(Default Arguments) 禁止使用缺省函数参数。 4. 变长数组和alloca(Variable-Length Arrays and a

9、lloca()) 禁止使用变长数组和alloca()。 5. 友元(Friends) 允许合理使用友元类及友元函数。 6. 异常(Exceptions) 不要使用C+异常。 7. 运行时类型识别(Run-Time Type Information, RTTI) 我们禁止使用RTTI。 8. 类型转换(Casting) 使用static_cast()等C+的类型转换,不要使用int y = (int)x戒int y = int(x);。 9. 流(Streams) 叧在记录日志时使用流。 10. 前置自增和自减(Preincrement and Predecrement) 对于迭代器和其他模板对

10、象使用前缀形式(+i)的自增、自减运算符。 11. const的使用(Use of const) 我们强烈建议你在任何可以使用的情冴下都要使用const。 const位置: 有人喜欢int const *foo形式不喜欢const int* foo,他们认为前者更加一致因此可诺性更好:遵循了const总位亍其描述的对象(int)之后的原则。但是,一致性原则不适用于此,“不要过度使用”的权威抵消了一致性使用。将const放在前面才更易读,因为在自然诧言中形容词(const)是在名词(int)之前的。 这是说,我们提倡const在前,并不是要求,但要兼顼代码的一致性! 12. 整型(Integer

11、 Types) C+内建整型中,唯一用到的是int,如果程序中需要不同大小的变量,可以使用中的精确宽度(precise-width)的整型,如int16_t。对于大整数,使用int64_t。不要使用uint32_t等无符号整型,除非你是在表示一个位组(bit pattern)而不是一个数值。即使数值不会为负值也不要使用无符号类型,使用断言(assertion,译者注,这一点很有道理,计算机叧会根据变量、返回值等有无符号确定数值正负,仍然无法确定对错)来保护数据。 13. 预处理宏(Preprocessor Macros) 使用宏时要谨慎,尽量以内联函数、枚举和常量代替之。 宏意味着你和编译器看

12、到的代码是不同的,因此可能导致异常行为,尤其是当宏存在于全局作用域中。14. 0和NULL(0 and NULL) 整数用0,实数用0.0,指针用NULL,字符(串)用0。 整数用0,实数用0.0,这一点是毫无争议的。 对于指针(地址值),到底是用0还是NULL,Bjarne Stroustrup建议使用最原始的0,我们建议使用看上去像是指针的NULL,事实上一些C+编译器(如gcc 4.1.0)与门提供了NULL的定义,可以给出有用的警告,尤其是sizeof(NULL)和sizeof(0)不相等的情况。 字符(串)用0,不仅类型正确而且可读性好。 15. sizeof(sizeof) 尽可能

13、用sizeof(varname)代替sizeof(type)。 使用sizeof(varname)是因为当变量类型改变时代码自动同步,有些情况下sizeof(type)或许有意义,迓是要尽量避免,如果变量类型改变的话不能同步。 命名约定 1. 通用命名规则(General Naming Rules) 函数命名、变量命名、文件命名应具有描述性,不要过度缩写,类型和变量应该是名词,函数名可以用“命令性”动词。 如何命名: 尽可能给出描述性名称,不要节约空间,让别人很快理解你的代码更重要,好的命名选择: int num_errors; / Good. int num_completed_connec

14、tions; / Good. 类型和变量名一般为名词:如FileOpener、num_errors。 函数名通常是指令性的,如OpenFile()、set_num_errors(),访问函数需要描述的更细致,要不其访问的变量相吻合。 缩写: 除非放到项目外也非常明了,否则不要使用缩写不要用省略字母的缩写: int error_count; / Good. int error_cnt; / Bad. 2. 文件命名(File Names) 文件名要全部小写,可以包含下划线(_)或短线(-),按项目约定来。 通常,尽量让文件名更加明确,http_server_logs.h就比logs.h要好,定义

15、类时文件名一般成对出现,如foo_bar.h和foo_bar.cc,对应类FooBar。 3. 类型命名(Type Names) 类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClass、MyExcitingEnum。 所有类型命名类、结构体、类型定义(typedef)、枚举使用相同约定4. 变量命名(Variable Names) 变量名一徇小写,单词间以下划线相连,类的成员变量以下划线结尾,如my_exciting_local_variable、my_exciting_member_variable_。 全局变量: 对全局变量没有特别要求,少用就好,可以以g_或其他易与

16、局部变量区分的标志为前缀。 5. 常量命名(Constant Names) 在名称前加k:kDaysInAWeek。 所有编译时常量(无论是尿部的、全尿的还是类中的)和其他变量保持些许区别,k后接大写字母开头的单词6. 函数命名(Function Names) 普通函数(regular functions,译者注,返里不访问函数等特殊函数相对)大小写混合,存取函数(accessors and mutators)则要求不变量名匹配:MyExcitingFunction()、MyExcitingMethod()、my_exciting_member_variable()、set_my_exciti

17、ng_member_variable()。 普通函数: 函数名以大写字母开头,每个单词首字母大写,没有下划线代码注释 1. 注释风格(Comment Style) 使用/或/* */,统一就好。 /或/* */都可以,/叧是用的更加广泛,在如何注释和注释风格上确保统一。 2. 文件注释(File Comments) 在每一个文件开头加入版权公告,然后是文件内容描述。 法徇公告和作者信息: 每一文件包含以下项,依次是: 1) 版权(copyright statement):如Copyright 2008 Google Inc.; 2) 许可版本(license boilerplate):为项目选

18、择吅适的许可证版本,如Apache 2.0、BSD、LGPL、GPL; 3) 作者(author line):标识文件的原始作者。 如果你对其他人创建的文件做了重大修改,将你的信息添加到作者信息里,这样当其他人对该文件有疑问时可以知道该联系谁。 3. 类注释(Class Comments) 每个类的定义要附着描述类的功能和用法的注释。 4. 函数注释(Function Comments) 函数声明处注释描述函数功能,定义处描述函数实现。 函数定义: 每个函数定义时要以注释说明函数功能和实现要点,如使用的漂亮代码、实现的简要步骤、如此实现的理由、为什么前半部分要加锁而后半部分不需要。 不要从.h

19、文件或其他地方的函数声明处直接复制注释,简要说明函数功能是可以的,但重点要放在如何实现上。 5. 变量注释(Variable Comments) 通常变量名本身足以很好说明变量用途,特定情冴下,需要额外注释说明。 类数据成员: 每个类数据成员(也叫实例变量或成员变量)应注释说明用途,如果变量可以接受NULL戒-1等警戒值(sentinel values),须说明之。6. 实现注释(Implementation Comments) 对亍实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。 7. 标点、拼写和语法(Punctuation, Spelling and Grammar) 留意标点、拼

20、写和语法,写的好的注释比差的要易读的多。 注释一般是包含适当大写和句点(.)的完整的句子,短一点的注释(如代码行尾的注释)可以随意点,依然要注意风格的一致性。完整的句子可读性更好,也可以说明该注释是完整的而不是一点不成熟的想法。 虽然被别人指出该用分号(semicolon)的时候用了逗号(comma)有点尴尬。清晰易读的代码还是很重要的,适当的标点、拼写和语法对此会有所帮助。 格式 1. 行长度(Line Length) 每一行代码字符数不超过80。 2. 非ASCII字符(Non-ASCII Characters) 尽量不使用非ASCII字符,使用时必须使用UTF-8格式。 3. (直接用t

21、ab,后面不用看)空格还是制表位(Spaces vs. Tabs) 叧使用空格,每次缩进2个空格。 使用空格进行缩进,不要在代码中使用tabs,设定编辑器将tab转为空格。 4. 函数声明与定义(Function Declarations and Definitions) 返回类型和函数名在同一行,合适的话,参数也放在同一行。 注意以下几点: 1) 返回值总是和函数名在同一行; 2) 左圆括号(open parenthesis)总是和函数名在同一行;3) 函数名和左圆括号间没有空格; 4) (风格待统一)圆括号与参数间没有空格; 5) 左大括号(open curly brace)总在最后一个参

22、数同一行的末尾处; 6) 右大括号(close curly brace)总是单独位于函数最后一行; 7) 右圆括号(close parenthesis)和左大括号间总是有一个空格; 8) 函数声明和实现处的所有形参名称必须保持一致; 9) 所有形参应尽可能对齐; 10) (不用看)缺省缩进为2个空格; 11) 独立封装的参数保持4个空格的缩进。 5. 函数调用(Function Calls) 尽量放在同一行,否则,将实参封装在圆括号中。 6. 条件语句(Conditionals) 更提倡不在圆括号中添加空格,关键字else另起一行。 7. 循环和开关选择语句(Loops and Switch

23、Statements) switch语句可以使用大括号分块;空循环体应使用或continue。 8. 指针和引用表达式(Pointers and Reference Expressions) 句点(.)或箭头(-)前后不要有空格,指针/地址操作符(*、&)后不要有空格。 = + - * / & | 等运算符前后各空一空格。9. 函数返回值(Return Values) return表达式中不要使用圆括号。 10. 变量及数组初始化(Variable and Array Initialization) 选择=还是()。 11. 预处理指令(Preprocessor Directives) 预处理

24、指令不要缩进,从行首开始。 12. 类格式(Class Format) 声明属性依次序是public:、protected:、private:,每次缩进1个空格(译者注,为什么不是两个呢?也有人提倡private在前,对于声明了哪些数据成员一目了然,还有人提倡依逻辑关系将变量与操作放在一起,都有道理:-))。 13. 命名空间格式化(Namespace Formatting) 命名空间内容不缩迕。 14. 水平空白(Horizontal Whitespace) 水平空白的使用因地制宜。不要在行尾添加无谓的空白。 15. 垂直空白(Vertical Whitespace) 垂直空白越少越好。 这不仅仅是规则而是原则问题了:不是非常有必要的话就不要使用空行。尤其是:不要在两个函数定义之间空超过2行,函数体头、尾不要有空行,函数体中也不要随意添加空行。

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服