Here we document style rules for C usage in the gRPC Core library.
- 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).
-
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/channel/channel_stack.h --> GRPC_INTERNAL_CORE_CHANNEL_CHANNEL_STACK_H
- 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)
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).
- Non-static functions must be prefixed by grpc_
- static functions must not be prefixed by grpc_
- enumeration values and #define names are uppercased, all others are lowercased
- Multiple word identifiers use underscore as a delimiter (NEVER camel casing)