1、Google C+Style Guidegoogle c+ 代码规范Google C+Style GuideRevision 3.188Benjy WeinbergerCraig SilversteinGregory EitzmannMark MentovaiTashana LandrayEach style point has a summary for which additional information is available by toggling the accompanying arrow button that looks this way:.You may toggle
2、all summaries with the big arrow button:Toggle all summariesHeader FilesThe#define GuardHeader File DependenciesInline FunctionsThe-inl.h FilesFunction Parameter OrderingNames and Order of IncludesScopingNamespacesNested ClassesNonmember,Static Member,and Global FunctionsLocal VariablesStatic and Gl
3、obal VariablesClassesDoing Work in ConstructorsDefault ConstructorsExplicit ConstructorsCopy ConstructorsStructs vs.ClassesInheritanceMultiple InheritanceInterfacesOperator OverloadingAccess ControlDeclaration OrderWrite Short FunctionsGoogle-Specific MagicSmart PointerscpplintOther C+FeaturesRefere
4、nce ArgumentsFunction OverloadingDefault ArgumentsVariable-Length Arrays and alloca()FriendsExceptionsRun-Time Type Information(RTTI)CastingStreamsPreincrement and PredecrementUse of constInteger Types64-bit PortabilityPreprocessor Macros0 and NULLsizeofBoostC+0xNamingGeneral Naming RulesFile NamesT
5、ype NamesVariable NamesConstant NamesFunction NamesNamespace NamesEnumerator NamesMacro NamesExceptions to Naming RulesCommentsComment StyleFile CommentsClass CommentsFunction CommentsVariable CommentsImplementation CommentsPunctuation,Spelling and GrammarTODO CommentsDeprecation CommentsFormattingL
6、ine LengthNon-ASCII CharactersSpaces vs.TabsFunction Declarations and DefinitionsFunction CallsConditionalsLoops and Switch StatementsPointer and Reference ExpressionsBoolean ExpressionsReturn ValuesVariable and Array InitializationPreprocessor DirectivesClass FormatConstructor Initializer ListsName
7、space FormattingHorizontal WhitespaceVertical WhitespaceExceptions to the RulesExisting Non-conformant CodeWindows CodeTable of ContentsImportant NoteDisplaying Hidden Details in this GuidelinkThis style guide contains many details that are initially hidden from view.They are marked by the triangle
8、icon,which you see here on your left.Click it now.You should seeHoorayappear below.Hooray!Now you know you can expand points to get more details.Alternatively,theres anexpand allat the top of this document.BackgroundC+is the main development language used by many of Googles open-source projects.As e
9、very C+programmer knows,the language has many powerful features,but this power brings with it complexity,which in turn can make code more bug-prone and harder to read and maintain.The goal of this guide is to manage this complexity by describing in detail the dos and donts of writing C+code.These ru
10、les exist to keep the code base manageable while still allowing coders to use C+language features productively.Style,also known as readability,is what we call the conventions that govern our C+code.The term Style is a bit of a misnomer,since these conventions cover far more than just source file for
11、matting.One way in which we keep the code base manageable is by enforcing consistency.It is very important that any programmer be able to look at anothers code and quickly understand it.Maintaining a uniform style and following conventions means that we can more easily usepattern-matchingto infer wh
12、at various symbols are and what invariants are true about them.Creating common,required idioms and patterns makes code much easier to understand.In some cases there might be good arguments for changing certain style rules,but we nonetheless keep things as they are in order to preserve consistency.An
13、other issue this guide addresses is that of C+feature bloat.C+is a huge language with many advanced features.In some cases we constrain,or even ban,use of certain features.We do this to keep code simple and to avoid the various common errors and problems that these features can cause.This guide list
14、s these features and explains why their use is restricted.Open-source projects developed by Google conform to the requirements in this guide.Note that this guide is not a C+tutorial:we assume that the reader is familiar with the language.Header FilesIn general,every.cc file should have an associated
15、.h file.There are some common exceptions,such as unittests and small.cc files containing just a main()function.Correct use of header files can make a huge difference to the readability,size and performance of your code.The following rules will guide you through the various pitfalls of using header f
16、iles.The#define GuardlinkAll header files should have#define guards to prevent multiple inclusion.The format of the symbol name should be_H_.To guarantee uniqueness,they should be based on the full path in a projects source tree.For example,the file foo/src/bar/baz.h in project foo should have the f
17、ollowing guard:#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_.#endif/FOO_BAR_BAZ_H_Header File DependencieslinkDont use an#include when a forward declaration would suffice.When you include a header file you introduce a dependency that will cause your code to be recompiled whenever the header file chan
18、ges.If your header file includes other header files,any change to those files will cause any code that includes your header to be recompiled.Therefore,we prefer to minimize includes,particularly includes of header files in other header files.You can significantly reduce the number of header files yo
19、u need to include in your own header files by using forward declarations.For example,if your header file uses the File class in ways that do not require access to the declaration of the File class,your header file can just forward declare class File;instead of having to#includefile/base/file.h.How c
20、an we use a class Foo in a header file without access to its definition? We can declare data members of type Foo*or Foo&. We can declare(but not define)functions with arguments,and/or return values,of type Foo.(One exception is if an argument Foo or const Foo&has a non-explicit,one-argument construc
21、tor,in which case we need the full definition to support automatic type conversion.) We can declare static data members of type Foo.This is because static data members are defined outside the class definition.On the other hand,you must include the header file for Foo if your class subclasses Foo or
22、has a data member of type Foo.Sometimes it makes sense to have pointer(or better,scoped_ptr)members instead of object members.However,this complicates code readability and imposes a performance penalty,so avoid doing this transformation if the only purpose is to minimize includes in header files.Of
23、course,.cc files typically do require the definitions of the classes they use,and usually have to include several header files.Note:If you use a symbol Foo in your source file,you should bring in a definition for Foo yourself,either via an#include or via a forward declaration.Do not depend on the sy
24、mbol being brought in transitively via headers not directly included.One exception is if Foo is used in myfile.cc,its ok to#include(or forward-declare)Foo in myfile.h,instead of myfile.cc.Inline FunctionslinkDefine functions inline only when they are small,say,10 lines or less.Definition:You can dec
25、lare functions in a way that allows the compiler to expand them inline rather than calling them through the usual function call mechanism.Pros:Inlining a function can generate more efficient object code,as long as the inlined function is small.Feel free to inline accessors and mutators,and other sho
26、rt,performance-critical functions.Cons:Overuse of inlining can actually make programs slower.Depending on a functions size,inlining it can cause the code size to increase or decrease.Inlining a very small accessor function will usually decrease code size while inlining a very large function can dram
27、atically increase code size.On modern processors smaller code usually runs faster due to better use of the instruction cache.Decision:A decent rule of thumb is to not inline a function if it is more than 10 lines long.Beware of destructors,which are often longer than they appear because of implicit
28、member-and base-destructor calls!Another useful rule of thumb:its typically not cost effective to inline functions with loops or switch statements(unless,in the common case,the loop or switch statement is never executed).It is important to know that functions are not always inlined even if they are
29、declared as such;for example,virtual and recursive functions are not normally inlined.Usually recursive functions should not be inline.The main reason for making a virtual function inline is to place its definition in the class,either for convenience or to document its behavior,e.g.,for accessors an
30、d mutators.The-inl.h FileslinkYou may use file names with a-inl.h suffix to define complex inline functions when needed.The definition of an inline function needs to be in a header file,so that the compiler has the definition available for inlining at the call sites.However,implementation code prope
31、rly belongs in.cc files,and we do not like to have much actual code in.h files unless there is a readability or performance advantage.If an inline function definition is short,with very little,if any,logic in it,you should put the code in your.h file.For example,accessors and mutators should certain
32、ly be inside a class definition.More complex inline functions may also be put in a.h file for the convenience of the implementer and callers,though if this makes the.h file too unwieldy you can instead put that code in a separate-inl.h file.This separates the implementation from the class definition,while still allowing the implementation to be included where necessary.Another use of-inl.h files is for definitions of function templates.This can be used to keep your template d
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1