xref: /aosp_15_r20/external/grpc-grpc/doc/c-style-guide.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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