没有合适的资源?快使用搜索试试~ 我知道了~
首页Google C++ Style Guide.pdf
由lovelyanimal精心制作的PDF版本,希望对喜爱C++的童鞋有帮助 Every major open-source project has its own style guide: a set of conventions (sometimes arbitrary) about how to write code for that project. It is much easier to understand a large codebase when all the code in it is in a consistent style.
资源详情
资源评论
资源推荐

Google C++ Style Guide
由 lovelyanimal 精心制作,优化了显示效果。
请到本人博客 http://blog.csdn.net/lovelyanimal 下载最新版本,不需要积分滴。
Revision 3.274
Benjy Weinberger
Craig Silverstein
Gregory Eitzmann
Mark Mentovai
Tashana Landray
Table of Contents
Header
Files
The #define Guard Forward Declarations Inline Functions The -inl.h Files
Function Parameter Ordering Names and Order of Includes
Scoping Namespaces Nested Classes Nonmember, Static Member, and Global Functions
Local Variables Static and Global Variables
Classes Doing Work in Constructors Initialization Explicit Constructors Copy Constructors
Delegating and inheriting constructors Structs vs. Classes Inheritance Multiple Inheritance
Interfaces Operator Overloading Access Control Declaration Order Write Short Functions
Google-
Specific
Magic
Ownership and Smart Pointers cpplint
Other C++
Features
Reference Arguments Rvalue references Function Overloading Default Arguments
Variable-Length Arrays and alloca() Friends Exceptions Run-Time Type Information (RTTI)
Casting Streams Preincrement and Predecrement Use of const Use of constexpr
Integer Types 64-bit Portability Preprocessor Macros 0 and nullptr/NULL sizeof auto
Brace Initialization Lambda expressions Boost C++11
Naming General Naming Rules File Names Type Names Variable Names Constant Names
Function Names Namespace Names Enumerator Names Macro Names
Exceptions to Naming Rules
Comments Comment Style File Comments Class Comments Function Comments Variable Comments
Implementation Comments Punctuation, Spelling and Grammar TODO Comments
Deprecation Comments
Formatting Line Length Non-ASCII Characters Spaces vs. Tabs Function Declarations and Definitions
Function Calls Braced Initializer Lists Conditionals Loops and Switch Statements
Pointer and Reference Expressions Boolean Expressions Return Values
Variable and Array Initialization Preprocessor Directives Class Format
Constructor Initializer Lists Namespace Formatting Horizontal Whitespace
Vertical Whitespace
Exceptions
to the
Rules
Existing Non-conformant Code Windows Code

Important Note
~ Displaying Hidden Details in this Guide
This style guide contains many details that are initially hidden from view. They are marked by the triangle icon, which you
see here on your left. Click it now. You should see "Hooray" appear below.
Hooray! Now you know you can expand points to get more details. Alternatively, there's an "expand all" at the top of this
document.
Background
C++ is the main development language used by many of Google's open-source projects. As every 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 don'ts of writing C++ code. These
rules 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 formatting.
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 another's code and quickly understand it. Maintaining a uniform style and following
conventions means that we can more easily use "pattern-matching" to infer what 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.
Another 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 lists 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 Files
In general, every .cc file should have an associated .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 files.
~ The #define Guard
All header files should have #define guards to prevent multiple inclusion. The format of the symbol name should be
<PROJECT>_<PATH>_<FILE>_H_.
To guarantee uniqueness, they should be based on the full path in a project's source tree. For example, the file
foo/src/bar/baz.h in project foo should have the following guard:

#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
~ Forward Declarations
You may forward declare ordinary classes in order to avoid unnecessary #includes.
Definition:
A "forward declaration" is a declaration of a class, function, or template without an associated definition. #include lines
can often be replaced with forward declarations of whatever symbols are actually used by the client code.
Pros:
Unnecessary #includes force the compiler to open more files and process more input.
They can also force your code to be recompiled more often, due to changes in the header.
Cons:
It can be difficult to determine the correct form of a forward declaration in the presence of features like templates,
typedefs, default parameters, and using declarations.
It can be difficult to determine whether a forward declaration or a full #include is needed for a given piece of
code, particularly when implicit conversion operations are involved. In extreme cases, replacing an #include with a
forward declaration can silently change the meaning of code.
Forward declaring multiple symbols from a header can be more verbose than simply #includeing the header.
Forward declarations of functions and templates can prevent the header owners from making otherwise-compatible
changes to their APIs; for example, widening a parameter type, or adding a template parameter with a default
value.
Forward declaring symbols from namespace std:: usually yields undefined behavior.
Structuring code to enable forward declarations (e.g. using pointer members instead of object members) can make
the code slower and more complex.
The practical efficiency benefits of forward declarations are unproven.
Decision:
When using a function declared in a header file, always #include that header.
When using a class template, prefer to #include its header file.
When using an ordinary class, relying on a forward declaration is OK, but be wary of situations where a forward
declaration may be insufficient or incorrect; when in doubt, just #include the appropriate header.
Do not replace data members with pointers just to avoid an #include.
Always #include the file that actually provides the declarations/definitions you need; do not rely on the symbol being
brought in transitively via headers not directly included. One exception is that myfile.cc may rely on #includes and
forward declarations from its corresponding header file myfile.h.
~ Inline Functions
Define functions inline only when they are small, say, 10 lines or less.
Definition:
You can declare 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 short, performance-critical functions.

Cons:
Overuse of inlining can actually make programs slower. Depending on a function's 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 dramatically 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 member- and base-destructor calls!
Another useful rule of thumb: it's 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 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 and mutators.
~ The -inl.h Files
You 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 properly 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 certainly 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 definitions
easy to read.
Do not forget that a -inl.h file requires a #define guard just like any other header file.
~ Function Parameter Ordering
When defining a function, parameter order is: inputs, then outputs.
Parameters to C/C++ functions are either input to the function, output from the function, or both. Input parameters are
usually values or const references, while output and input/output parameters will be non-const pointers. When ordering
function parameters, put all input-only parameters before any output parameters. In particular, do not add new
parameters to the end of the function just because they are new; place new input-only parameters before the output
parameters.
This is not a hard-and-fast rule. Parameters that are both input and output (often classes/structs) muddy the waters, and,
as always, consistency with related functions may require you to bend the rule.
~ Names and Order of Includes
Use standard order for readability and to avoid hidden dependencies: C library, C++ library, other libraries' .h, your
project's .h.
All of a project's header files should be listed as descendants of the project's source directory without use of UNIX
directory shortcuts . (the current directory) or .. (the parent directory). For example, google-awesome-
project/src/base/logging.h should be included as
#include "base/logging.h"

In dir/foo.cc or dir/foo_test.cc, whose main purpose is to implement or test the stuff in dir2/foo2.h, order your
includes as follows:
1. dir2/foo2.h (preferred location — see details below).
2. C system files.
3. C++ system files.
4. Other libraries' .h files.
5. Your project's .h files.
With the preferred ordering, if dir2/foo2.h omits any necessary includes, the build of dir/foo.cc or dir/foo_test.cc
will break. Thus, this rule ensures that build breaks show up first for the people working on these files, not for innocent
people in other packages.
dir/foo.cc and dir2/foo2.h are often in the same directory (e.g. base/basictypes_test.cc and
base/basictypes.h), but can be in different directories too.
Within each section the includes should be ordered alphabetically. Note that older code might not conform to this rule
and should be fixed when convenient.
For example, the includes in google-awesome-project/src/foo/internal/fooserver.cc might look like this:
#include "foo/public/fooserver.h" // Preferred location.
#include <sys/types.h>
#include <unistd.h>
#include <hash_map>
#include <vector>
#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h"
Exception: sometimes, system-specific code needs conditional includes. Such code can put conditional includes after other
includes. Of course, keep your system-specific code small and localized. Example:
#include "foo/public/fooserver.h"
#include "base/port.h" // For LANG_CXX11.
#ifdef LANG_CXX11
#include <initializer_list>
#endif // LANG_CXX11
Scoping
~ Namespaces
Unnamed namespaces in .cc files are encouraged. With named namespaces, choose the name based on the project, and
possibly its path. Do not use a
using-directive
. Do not use inline namespaces.
Definition:
Namespaces subdivide the global scope into distinct, named scopes, and so are useful for preventing name collisions in
the global scope.
剩余54页未读,继续阅读











安全验证
文档复制为VIP权益,开通VIP直接复制

评论1