《C++编程风格指南.docx》由会员分享,可在线阅读,更多相关《C++编程风格指南.docx(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.译Google C+编程风格指南()完 Fox 2008-07-23 15:42:32, $62 翻译 C+ 开始评论本文最早(2008/07/23)发表于:C+博客原文地址:Google C+ Style Guide 规则之例外前面说明的编码习惯基本是强制性的,但所有优秀的规则都允许例外。1 .现有不统一代码(Existing Non-conformant Code)对于现有不符合既定编程风格的代码可以网开一面。当你修改使用其他风格的代码时,为了与代码原有风格保持一致可以不使用本指 南约定。如果不放心可以与代码原作者或现在的负责人员商讨,记住,一致性包 括原有的一致性。1. Windows
2、 代码(Windows Code)Windows程序员有自己的编码习惯,主要源于Windows的些头文件和其他 Microsoft代码。我们希望任何人都可以顺利读懂你的代码,所以针对所有平台 的C+编码给出个单独的指导方案。如果你一直使用Windows编码风格的,这儿有必要重申一下某些你可能会忘记的 指南(译者注,我怎么感觉像在被洗脑:D):1)不要使用匈牙利命名法(Hungarian notation,如定义整型变量为iNum), 使用Google命名约定,包括对源文件使用.cc扩展名:2) Windows定义了很多原有内建类型的同义词(译者注,这一点,我也很反感), 如DWORD、HAND
3、LE等等,在调用Windows API时这是完全可以接受甚至鼓励的, 但还是尽量使用原来的C+类型,例如,使用const TCHAR *而不是LPCTSTR;3)使用Microsoft Visual C+进行编译时,将警告级别设置为3或更髙,并将 所有warnings当作errors处理:4)不要使用#pragma once;作为包含保护,使用C+标准包含保护,包含保护的 文件路径包含到项目树顶层(译者注,#include);5)除非万不得已,否则不使用任何不标准的扩展,如#pragma和deci spec, 允许使用_declspec (dll import)和一deci spec (dll
4、export),但必须通过 DLL IMPORT和DLLEXPORT等宏,以便其他人在共享使用这些代码时容易放弃这些 扩展。在Windows上,只有很少些偶尔可以不遵守的规则:1)通常我们禁止使用多重继承,但在使用COM和ATL/WTL类时可以使用多重继 承,为了执行继或包/迫上类及其接口时可以使用多重实现继承;2)虽然代码中不应使用异常,但在ATL和部分STL (包括Visual C+的STL) 中异常被广泛使用,使用ATL时,应定义.ATL_NO_EXCEPT1ONS以屏蔽异常,你 要研究一下是否也屏蔽掉STL的异常,如巢不辞最开启编译器异常也可以,注 意这只是为了编译STL,自己仍然不要
5、写含异常处理的代码;3)通常每个项目的每个源文件中都包含-个名为StdAfx. h或precompile. h的 头文件方便头文件预编译,为了使代码方便与其他项目共享,避免显式包含此文 件(precompile, cc除外),使用编译器选项/F1以自动包含;4)通常名为resource/、且只包含宏的资源头文件,不必拘泥于此风格指南。团队合作参考常识,保持一致。编辑代码时,花点时间看看项目中的其他代码并确定其风格,如果其他代码if 语句中使用空格,那么你也要使用。如果其中的注释用星号(*)围成个盒子 状,你也这样做;* Some comments are here.* There may be
6、 many lines.编程风格指南的使用要点在于提供个公共的编码规范,所有人可以把精力集中 在实现内容而不是表现形式上。我们给出了全局的风格规范,但局部的风格也很 重要,如果你在个文件中新加的代码和原有代码风格相去甚远的话,这就破坏 了文件本身的整体美观也影响阅读,所以要尽量避免。好了,关于编码风格写的差不多了,代码本身是更有趣的,尽情享受吧!Benjy WeinbergerCraig SilversteinGregory Ei tzmannMark MentovaiTashana Landray译者:终于翻完了,前后历时两周,整个过程中,虽因工作关系偶有懈怠,但 总算不是虎头蛇尾(起码我的
7、态度是非常认真的:D),无论是否能对你有所裨 益,对我而言,至少是温习了一些以前知道的知识,也学到了一些之前不知道 的知识。刚好这两天还不是特紧张,赶紧翻完了,要开始干活了.译Google C+编程风格指南(七) Fox 2008-07-23 15:40:04, $82翻译 C+ 开始评论本文最早(2008/07/23)发表于:C+博客原文地址:Google C+ Style Guide,格式代码风格和格式确实比较随意,但个项目中所有人遵循同风格是非常容易 的,作为个人未必同意下述格式规则的每处,但整个项目服从统的编程风格 是很重要的,这样做才能让所有人在阅读和理解代码时更加容易。1 .行长度
8、(Line Length)每一行代码字符数不超过80 我们也认识到这条规则是存有争议的,但如此多的代码都遵照这规则,我们感 觉一致性更重要。优点:提倡该原则的人认为强迫他们调整编辑器窗口大小很野蛮。很多人同时并 排开几个窗口,根本没有多余空间拓宽某个窗口,人们将窗口最大尺寸加以限定, 一致使用80列宽,为什么要改变呢?缺点:反对该原则的人则认为更宽的代码行更易阅读,80列的限制是上个世纪 60年代的大型机的古板缺陷;现代设备具有更宽的显示屏,很轻松的可以显示 更多代码。结论:80个字符是最大值。例外: 1)如果一行注释包含了超过80字符的命令或URL,出于复制粘贴的方便可以超 过80字符;2)
9、包含长路径的可以超出80歹,尽量避免;3)头文件保护(防止重复包含第一篇)可以无视该原则。2 .非 ASCH 字符(Non-ASCII Characters)尽量不使用非ASCII字符,使用时必须使用UTF-8格式。哪怕是英文,也不应将用户界面的文本硬编码到源代码中,因此非ASCII字符要 少用。特殊情况下可以适当包含此类字符,如,代码分析外部数据文件时,可以 适当硬编码数据文件中作为分隔符的非ASCII字符串;更常用的是(不需要本地 化的)单元测试代码可能包含非ASCII字符串。此类情况下,应使用UTF-8格式, 因为很多工具都可以理解和处理其编码,十六进制编码也可以,尤其是在增强可 读性的
10、情况下 如、xEFxBBxBF”是 Unicode 的 zero-w情th no-break space 字符,以UTF-8格式包含在源文件中是不可见的。3 .空格还是制表位(Spaces vs. Tabs)只使用空格,每次缩进2个空格。使用空格进行缩进,不要在代码中使用tabs,设定编辑器将tab转为空格。译者注:在前段时间的关于Debian开发学习日记一文中,曾给出针对C/C+编 码使用的vim配置。4 .函数声明与定义(Function Declarations and Definitions)返回类型和函数名在同行,合适的话,参数也放在同一行。函数看上去像这样:ReturnType C
11、lassName:FunctionName(Type par_namel, Type par_name2) DoSomethingO ;如果同一行文本较多,容不下所有参数:ReturnType ClassName:Real1yLongFunctionName(Type par_namel, Type par_name2, Type par_name3) DoSomethingO ;甚至连第一个参数都放不下:ReturnType LongClassName:ReallyReallyReallyLongFunctionName(Type par_namel, / 4 space indentTyp
12、e par_name2,Type par_name3) DoSomethingO ; / 2 space indent注意以下儿点:1)返回值总是和函数名在同一行;2)左圆括号(open parenthesis)总是和函数名在同一行;3)函数名和左圆括号间没有空格;4)圆括号与参数间没有空格;5)左大括号(open curly brace)总在最后一-个参数同一一行的末尾处;6)右大括号(close curly brace)总是单独位于函数最后,彳了;7)右圆括号(close parenthesis)和左大括号间总是有一个空格;8)函数声明和实现处的所有形参名称必须保持一致;9)所有形参应尽可
13、能对齐;10)缺省缩进为2个空格; 11)独立封装的参数保持4个空格的缩进。如果函数为const的,关键字const应与最后个参数位于同一行。/ Everything in this function signature fits on a single line ReturnType FunctionName(Type par) const / This function signature requires multiple lines, but / the const keyword is on the line with the last parameter. ReturnType R
14、eallyLongFunctionName(Type pari,Type par2) const )如果有些参数没有用到,在函数定义处将参数名注释起来:/ Always have named parameters in interfaces.class Shape (public:virtual void Rotate(double radians) = 0; )/ Always have named parameters in the declaration.class Circle : public Shape public:virtual void Rotate(double radia
15、ns); )/ Comment out unused named parameters in definitions.void Circle:Rotate(double /*radians*/) / Bad - if someone wants to implement later, its not clear what the / variable means.void Circle:Rotate(double) 译者注:关于UNIX/Linux风格为什么要把左大括号置于行尾(.cc文件的函数 实现处,左大括号位于行首),我的理解是代码看上去比较简约,想想行首除了 函数体被对大括号封在起之外
16、,只有右大括号的代码看上去确实也舒服; Windows风格将左大括号置于行首的优点是匹配情况一目了然。5 .函数调用(Function Calls)尽量放在同一行,否则,将实参封装在圆括号中。函数调用遵循如下形式:bool retval = DoSomething(argument1, argument2, arguments);如果同一行放不下,可断为多行,后面每一行都和第一个实参对齐,左圆括号后 和右圆括号前不要留空格:bool retval = DoSomething(averyveryveryverylongargumentl, argument2, arguments);如果函数参数
17、比较多,可以出于可读性的考虑每行只放个参数:bool retval = DoSomething(argument1, argument2, arguments, argument4);如果函数名太长,以至于超过行最大长度,可以将所有参数独立成行:if (.)(if (.)(DoSomethingThatRequiresALongFunctionName ( very_long_argument1, / 4 space indent argument2, arguments, argument4);)6 .条件语句(Conditionals)更提倡不在圆括号中添加空格,关键字else另起一行。对
18、基本条件语句有两种可以接受的格式,种在圆括号和条件之间有空格,一-种 没有。最常见的是没有空格的格式,那种都可以,还是一致性为主。如果你是在修改 个文件,参考当前已有格式;如果是写新的代码,参考目录下或项目中其他文件 的格式,还在徘徊的话,就不要加空格了。if (condition) / no spaces inside parentheses . / 2 space indent. else / The else goes on the same line as the closing brace.)如果你倾向于在圆括号内部加空格:if ( condition ) / spaces insi
19、de parentheses - rare ./ 2 space indent. else / The else goes on the same line as the closing brace.注意所有情况下if和左圆括号间有个空格,右圆括号和左大括号(如果使用的 话)间也要有个空格:if(condition)/ Bad - space missing after IF.if (condition) / Bad - space missing before .if(condition) / Doubly bad.if (condition) / Good - proper space a
20、fter IF and before .有些条件语句写在同一行以增强可读性,只有当语句简单并且没有使用else子 句时使用:if (x = kFoo) return new Foo();if (x = kBar) return new Bar();如果语句有else分支是不允许的:/ Not allowed 一 !F statement on one line when there is an ELSE clause if (x) DoThisO ;else DoThat ();通常,单行语句不需要使用大括号,如果你喜欢也无可厚非,也有人要求if必 须使用大括号:if (condition)D
21、oSomethingO ; / 2 space indent.if (condition) DoSomethingO ; / 2 space indent.)但如果语句中哪分支使用了大括号的话,其他部分也必须使用:/ Not allowed - curly on IF but not ELSEif (condition) foo; elsebar;/ Not allowed - curly on ELSE but not IFif (condition)foo;else bar;/ Curly braces around both IF and ELSE required because/ o
22、ne of the clauses used braces.if (condition) foo; else bar;)7.循环和开关选择语句(Loops and Switch Statements)switch语句可以使用大括号分块;空循环体应使用或continueoswitch语句中的case块可以使用大括号也可以不用,取决于你的喜好,使用时 要依下文所述。如果有不满足case枚举条件的值,要总是包含个default (如果有输入值没 有case去处理,编译器将报警)。如果default永不会执行,可以简单的使用 assert:switch (var) case 0: / 2 space
23、indent Z/ 4 space indentbreak;case 1: break;)default: assert (false);)空循环体应使用或continue,而不是个简单的分号:while (condition) / Repeat test until it returns false.for (int i = 0; i )前后不要有空格,指针/地址操作符(、&)后不要有空 格。下面是指针和引用表达式的正确范例:X 二P;p = &X;X = r. y;x = r-y;注意:1)在访问成员时,句点或箭头前后没有空格;2)指针操作符或&后没有空格。在声明指针变量或参数时,星号与类
24、型或变量名紧挨都可以:/ These are fine, space preceding.char *c;const string &str;/ These are fine, space following.char* c; / but remember to do char* c, *d, *e,const string& str;char * c; / Bad - spaces on both sides of *const string & str; / Bad - spaces on both sides of &同一个文件(新建或现有)中起码要保持一致。译者注:个人比较习惯与变量紧
25、挨的方式。9 .布尔表达式(Boolean Expressions)如果一个布尔表达式超过标准行宽(80字符),如果断行要统下。下例中,逻辑与(&)操作符总位于行尾:if (this_one_thing this_other_thing &a_third_thing = a_fourth_thing &yet_another & last_one) 两个逻辑与(&)操作符都位于行尾,可以考虑额外插入圆括号,合理使用的话 对增强可读性是很有帮助的。译者注:个人比较习惯逻辑运算符位于行首,逻辑关系一目了然,各人喜好而 已,至于加不加圆括号的问题,如果你对优先级了然于胸的话可以不加,但可 读性总是差
26、了些。10 .函数返回值(Return Values)return表达式中不要使用圆括号。函数返回时不要使用圆括号:return x; / not return(x);11 .变量及数组初始化(Variable and Array Initialization)选择二还是0。需要做二者之间做出选择,下面的形式都是正确的:int x = 3;int x(3);string name(Some Name);string name =Some Name;12 .预处理指令(Preprocessor Directives)预处理指令不要缩进,从行首开始。即使预处理指令位于缩进代码块中,指令也应从行首开
27、始。/ Good - directives at beginning of lineif (lopsided_score) #if DISASTER_PENDING/ Correct - Starts at beginning of lineDropEverything ();#endifBackToNormal ();)/ Bad - indented directivesif (lopsidedscore) #if DISASTER PENDING / Wrong! The /z#if,z should be at beginning of lineDropEverything();Sen
28、dif/ Wrong! Do not indent #endifBackToNormal ();13.类格式(Class Format) 声明属性依次序是public:、protected: private:,每次缩进1个空格(译者 注,为什么不是两个呢?也有人提倡private在前,对于声明了哪些数据成员 目了然,还有人提倡依逻辑关系将变量与操作放在起,都有道理:一)。类声明(对类注释不了解的话,参考第六篇中的类注释节)的基本格式如下:class MyClass : public OtherClass public:/ Note the 1 space indent!MyClass(); /
29、 Regular 2 space indent.explicit MyClass(int var);MyClass () void SomeFunction();void SomeFunctionThatDoesNothing() void set_some_var(int var) some_var_ = var; int some_var() const return some_var_; private:bool SomelnternalFunctionO:int some_var_;int some_other_var_;DISALLOW_COPY_AND_ASSIGN(MyClass
30、););注意:1)所以基类名应在80列限制下尽量与子类名放在同一行;2)关键词public:、protected: private:要缩进1个空格(译者注,MSVC多 使用tab缩进,且这三个关键词没有缩进);3)除第一个关键词(一一般是public)外,其他关键词前空一行,如果类比较小 的话也可以不空;4)这些关键词后不要空行:5) public放在最前面,然后是protected和private;6)关于声明次序参考第篇声明次序节。14 .初始化列表(Initializer Lists) 构造函数初始化列表放在同行或按四格缩进并排儿行。两种可以接受的初始化列表格式:/ When it al
31、l fits on one line:MyClass:MyClass(int var) : some_var_(var), some_other_var_(var + 1) 或/ When it requires multiple lines, indent 4 spaces, putting the colon on/ the first initializer line:MyClass:MyClass(int var):some_var_(var),/ 4 space indentsome_other_var_(var + 1) / lined upDoSomethingO ;)15 .命
32、名空间格式化(Namespace Formatting)命名空间内容不缩进。命名空间不添加额外缩进层次,例如:namespace void foo() / Correct. No extra indentation within namespace.) / namespace不要缩进:namespace / Wrong. Indented when it should not be.void foo () / namespace16.水平留白(Horizontal Whitespace)水平留白的使用因地制宜。不要在行尾添加无谓的留白。普通:void f (bool b) / Open bra
33、ces should always have a space before them.int i = 0; / Semicolons usually have no space before them.int x = 0 ; / Spaces inside braces for array initialization are int x = 0 ;/ optional. If you use them, put them on both sides!/ Spaces around the colon in inheritance and initializer lists.class Foo
34、 : public Bar public:/ For inline function implementations, put spaces between the braces / and the implementation itself.Foo(int b) : Bar(), baz_(b) / No spaces inside empty braces.void Reset() baz_ = 0; / Spaces separating braces from implementation.添加冗余的留白会给其他人编辑时造成额外负担,因此,不要加入多余的空格。 如果确定一行代码已经修改
35、完毕,将多余的空格去掉;或者在专门清理空格时去 掉(确信没有其他人在使用)。循环和条件语句:if (b) else )while (test) switch (i) for (int i = 0;/ Space after the keyword in conditions and loops./ Spaces around else./ There is usually no space inside parentheses. 5; +i) switch ( i ) / Loops and conditions may have spaces insideif ( test )for ( i
36、nt i/ parentheses, but this is rare. Be consistent. 0; i 5; +i ) for ( ; i 5 ; +i)/ For loops always have a / semicolon, and may have / semicolon.space after the a space before theswitch (i) case 1:/ No space beforecolon in a switch case.case 2: break; / Use a space after a colon if there, s code af
37、ter it.操作符:x = 0;/ Assignment operators always have spaces around/ them.x = -5;/No spaces separating unary operators and their+x;/ arguments.if (x & !y)v =w*x + y/z; / Binary operators usually have spaces around them, v = w*x + y/z;/ but its okay to remove spaces around factors.v=w*(x+z); / Parenthe
38、ses should have no spaces inside them.模板和转换:vector x;/No spaces inside the angley = static_cast(x); / brackets and ), before/ ( in a cast.vector x;/ Spaces between type and pointer are/ okay, but be consistent.setlist x;/ C+ requires a space in .set list x;/ You may optionally make use/ symmetric spacing in NewIterator();/ for (iter-Seek(foo); !iter-done(); iter-Next() / process(iter-key(), iter-value();/ / delete iter;cl