1*cc02d7e2SAndroid Build Coastguard WorkerGRPC C STYLE GUIDE 2*cc02d7e2SAndroid Build Coastguard Worker===================== 3*cc02d7e2SAndroid Build Coastguard Worker 4*cc02d7e2SAndroid Build Coastguard WorkerBackground 5*cc02d7e2SAndroid Build Coastguard Worker---------- 6*cc02d7e2SAndroid Build Coastguard Worker 7*cc02d7e2SAndroid Build Coastguard WorkerHere we document style rules for C usage in the gRPC Core library. 8*cc02d7e2SAndroid Build Coastguard Worker 9*cc02d7e2SAndroid Build Coastguard WorkerGeneral 10*cc02d7e2SAndroid Build Coastguard Worker------- 11*cc02d7e2SAndroid Build Coastguard Worker 12*cc02d7e2SAndroid Build Coastguard Worker- Layout rules are defined by clang-format, and all code should be passed 13*cc02d7e2SAndroid Build Coastguard Worker through clang-format. A (docker-based) script to do so is included in 14*cc02d7e2SAndroid Build Coastguard Worker [tools/distrib/clang\_format\_code.sh](../tools/distrib/clang_format_code.sh). 15*cc02d7e2SAndroid Build Coastguard Worker 16*cc02d7e2SAndroid Build Coastguard WorkerHeader Files 17*cc02d7e2SAndroid Build Coastguard Worker------------ 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker- Public header files (those in the include/grpc tree) should compile as 20*cc02d7e2SAndroid Build Coastguard Worker pedantic C89. 21*cc02d7e2SAndroid Build Coastguard Worker- Public header files should be includable from C++ programs. That is, they 22*cc02d7e2SAndroid Build Coastguard Worker should include the following: 23*cc02d7e2SAndroid Build Coastguard Worker ```c 24*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus 25*cc02d7e2SAndroid Build Coastguard Worker extern "C" { 26*cc02d7e2SAndroid Build Coastguard Worker # endif 27*cc02d7e2SAndroid Build Coastguard Worker 28*cc02d7e2SAndroid Build Coastguard Worker /* ... body of file ... */ 29*cc02d7e2SAndroid Build Coastguard Worker 30*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus 31*cc02d7e2SAndroid Build Coastguard Worker } 32*cc02d7e2SAndroid Build Coastguard Worker # endif 33*cc02d7e2SAndroid Build Coastguard Worker ``` 34*cc02d7e2SAndroid Build Coastguard Worker- Header files should be self-contained and end in .h. 35*cc02d7e2SAndroid Build Coastguard Worker- All header files should have a `#define` guard to prevent multiple inclusion. 36*cc02d7e2SAndroid Build Coastguard Worker To guarantee uniqueness they should be based on the file's path. 37*cc02d7e2SAndroid Build Coastguard Worker 38*cc02d7e2SAndroid Build Coastguard Worker For public headers: `include/grpc/grpc.h` → `GRPC_GRPC_H` 39*cc02d7e2SAndroid Build Coastguard Worker 40*cc02d7e2SAndroid Build Coastguard Worker For private headers: 41*cc02d7e2SAndroid Build Coastguard Worker `src/core/lib/channel/channel_stack.h` → 42*cc02d7e2SAndroid Build Coastguard Worker `GRPC_CORE_LIB_CHANNEL_CHANNEL_STACK_H` 43*cc02d7e2SAndroid Build Coastguard Worker 44*cc02d7e2SAndroid Build Coastguard WorkerVariable Initialization 45*cc02d7e2SAndroid Build Coastguard Worker----------------------- 46*cc02d7e2SAndroid Build Coastguard Worker 47*cc02d7e2SAndroid Build Coastguard WorkerWhen declaring a (non-static) pointer variable, always initialize it to `NULL`. 48*cc02d7e2SAndroid Build Coastguard WorkerEven in the case of static pointer variables, it's recommended to explicitly 49*cc02d7e2SAndroid Build Coastguard Workerinitialize them to `NULL`. 50*cc02d7e2SAndroid Build Coastguard Worker 51*cc02d7e2SAndroid Build Coastguard Worker 52*cc02d7e2SAndroid Build Coastguard WorkerC99 Features 53*cc02d7e2SAndroid Build Coastguard Worker------------ 54*cc02d7e2SAndroid Build Coastguard Worker 55*cc02d7e2SAndroid Build Coastguard Worker- Variable sized arrays are not allowed. 56*cc02d7e2SAndroid Build Coastguard Worker- Do not use the 'inline' keyword. 57*cc02d7e2SAndroid Build Coastguard Worker- Flexible array members are allowed 58*cc02d7e2SAndroid Build Coastguard Worker (https://en.wikipedia.org/wiki/Flexible_array_member). 59*cc02d7e2SAndroid Build Coastguard Worker 60*cc02d7e2SAndroid Build Coastguard WorkerComments 61*cc02d7e2SAndroid Build Coastguard Worker-------- 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard WorkerWithin public header files, only `/* */` comments are allowed. 64*cc02d7e2SAndroid Build Coastguard Worker 65*cc02d7e2SAndroid Build Coastguard WorkerWithin implementation files and private headers, either single line `//` 66*cc02d7e2SAndroid Build Coastguard Workeror multi line `/* */` comments are allowed. Only one comment style per file is 67*cc02d7e2SAndroid Build Coastguard Workerallowed however (i.e. if single line comments are used anywhere within a file, 68*cc02d7e2SAndroid Build Coastguard WorkerALL comments within that file must be single line comments). 69*cc02d7e2SAndroid Build Coastguard Worker 70*cc02d7e2SAndroid Build Coastguard WorkerSymbol Names 71*cc02d7e2SAndroid Build Coastguard Worker------------ 72*cc02d7e2SAndroid Build Coastguard Worker 73*cc02d7e2SAndroid Build Coastguard Worker- Non-static functions must be prefixed by `grpc_` 74*cc02d7e2SAndroid Build Coastguard Worker- Static functions must *not* be prefixed by `grpc_` 75*cc02d7e2SAndroid Build Coastguard Worker- Typenames of `struct`s , `union`s, and `enum`s must be prefixed by `grpc_` if 76*cc02d7e2SAndroid Build Coastguard Worker they are declared in a header file. They must not be prefixed by `grpc_` if 77*cc02d7e2SAndroid Build Coastguard Worker they are declared in a source file. 78*cc02d7e2SAndroid Build Coastguard Worker- Enumeration values and `#define` names must be uppercase. All other values 79*cc02d7e2SAndroid Build Coastguard Worker must be lowercase. 80*cc02d7e2SAndroid Build Coastguard Worker- Enumeration values or `#define` names defined in a header file must be 81*cc02d7e2SAndroid Build Coastguard Worker prefixed with `GRPC_` (except for `#define` macros that are being used to 82*cc02d7e2SAndroid Build Coastguard Worker substitute functions; those should follow the general rules for 83*cc02d7e2SAndroid Build Coastguard Worker functions). Enumeration values or `#define`s defined in source files must not 84*cc02d7e2SAndroid Build Coastguard Worker be prefixed with `GRPC_`. 85*cc02d7e2SAndroid Build Coastguard Worker- Multiple word identifiers use underscore as a delimiter, *never* camel 86*cc02d7e2SAndroid Build Coastguard Worker case. E.g. `variable_name`. 87*cc02d7e2SAndroid Build Coastguard Worker 88*cc02d7e2SAndroid Build Coastguard WorkerFunctions 89*cc02d7e2SAndroid Build Coastguard Worker---------- 90*cc02d7e2SAndroid Build Coastguard Worker 91*cc02d7e2SAndroid Build Coastguard Worker- The use of [`atexit()`](http://man7.org/linux/man-pages/man3/atexit.3.html) is 92*cc02d7e2SAndroid Build Coastguard Worker in forbidden in libgrpc. 93