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.