Here we document style rules for C usage in the gRPC Core library.
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:
#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
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
.
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).
grpc_
grpc_
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.#define
names must be uppercase. All other values must be lowercase.#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_
.variable_name
.atexit()
is in forbidden in libgrpc.