|
|
|
GRPC C STYLE GUIDE
|
|
|
|
=====================
|
|
|
|
|
|
|
|
Background
|
|
|
|
----------
|
|
|
|
|
|
|
|
Here we document style rules for C usage in the gRPC Core library.
|
|
|
|
|
|
|
|
General
|
|
|
|
-------
|
|
|
|
|
|
|
|
- Layout rules are defined by clang-format, and all code should be passed
|
|
|
|
through clang-format. A (docker-based) script to do so is included in
|
|
|
|
[tools/distrib/clang\_format\_code.sh](../tools/distrib/clang_format_code.sh).
|
|
|
|
|
|
|
|
Header Files
|
|
|
|
------------
|
|
|
|
|
|
|
|
- Public header files (those in the include/grpc tree) should compile as
|
|
|
|
pedantic C89.
|
|
|
|
- Public header files should be includable from C++ programs. That is, they
|
|
|
|
should include the following:
|
|
|
|
```c
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
# endif
|
|
|
|
|
|
|
|
/* ... body of file ... */
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
```
|
|
|
|
- Header files should be self-contained and end in .h.
|
|
|
|
- All header files should have a `#define` guard to prevent multiple inclusion.
|
|
|
|
To guarantee uniqueness they should be based on the file's path.
|
|
|
|
|
|
|
|
For public headers: `include/grpc/grpc.h` → `GRPC_GRPC_H`
|
|
|
|
|
|
|
|
For private headers:
|
|
|
|
`src/core/lib/channel/channel_stack.h` →
|
|
|
|
`GRPC_CORE_LIB_CHANNEL_CHANNEL_STACK_H`
|
|
|
|
|
|
|
|
Variable Initialization
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
When declaring a (non-static) pointer variable, always initialize it to `NULL`.
|
|
|
|
Even in the case of static pointer variables, it's recommended to explicitly
|
|
|
|
initialize them to `NULL`.
|
|
|
|
|
|
|
|
|
|
|
|
C99 Features
|
|
|
|
------------
|
|
|
|
|
|
|
|
- Variable sized arrays are not allowed.
|
|
|
|
- Do not use the 'inline' keyword.
|
|
|
|
- Flexible array members are allowed
|
|
|
|
(https://en.wikipedia.org/wiki/Flexible_array_member).
|
|
|
|
|
|
|
|
Comments
|
|
|
|
--------
|
|
|
|
|
|
|
|
Within public header files, only `/* */` comments are allowed.
|
|
|
|
|
|
|
|
Within implementation files and private headers, either single line `//`
|
|
|
|
or multi line `/* */` comments are allowed. Only one comment style per file is
|
|
|
|
allowed however (i.e. if single line comments are used anywhere within a file,
|
|
|
|
ALL comments within that file must be single line comments).
|
|
|
|
|
|
|
|
Symbol Names
|
|
|
|
------------
|
|
|
|
|
|
|
|
- Non-static functions must be prefixed by `grpc_`
|
|
|
|
- Static functions must *not* be prefixed by `grpc_`
|
|
|
|
- Typenames of `struct`s , `union`s, and `enum`s must be prefixed by `grpc_` if
|
|
|
|
they are declared in a header file. They must not be prefixed by `grpc_` if
|
|
|
|
they are declared in a source file.
|
|
|
|
- Enumeration values and `#define` names must be uppercase. All other values
|
|
|
|
must be lowercase.
|
|
|
|
- Enumeration values or `#define` names defined in a header file must be
|
|
|
|
prefixed with `GRPC_` (except for `#define` macros that are being used to
|
|
|
|
substitute functions; those should follow the general rules for
|
|
|
|
functions). Enumeration values or `#define`s defined in source files must not
|
|
|
|
be prefixed with `GRPC_`.
|
|
|
|
- Multiple word identifiers use underscore as a delimiter, *never* camel
|
|
|
|
case. E.g. `variable_name`.
|
|
|
|
|
|
|
|
Functions
|
|
|
|
----------
|
|
|
|
|
|
|
|
- The use of [`atexit()`](http://man7.org/linux/man-pages/man3/atexit.3.html) is
|
|
|
|
in forbidden in libgrpc.
|