aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar jboeuf <jboeuf@users.noreply.github.com>2016-01-04 12:33:45 -0800
committerGravatar jboeuf <jboeuf@users.noreply.github.com>2016-01-04 12:33:45 -0800
commit5e4775f0bfb9485a01961a846d9fe1c1b79b7dfc (patch)
treea72aad2880f21062ca6d09d24f02d6a631d184cf
parentceaa3c81f98f40255e4a9a35654eb280e7e9e901 (diff)
parentff298f68884ec48d3bb5f678278c8b21f7a1f31c (diff)
Merge pull request #4561 from ctiller/StyleGuide
Initial style guide notes for C
-rw-r--r--doc/c-style-guide.md65
1 files changed, 65 insertions, 0 deletions
diff --git a/doc/c-style-guide.md b/doc/c-style-guide.md
new file mode 100644
index 0000000000..87de8892dd
--- /dev/null
+++ b/doc/c-style-guide.md
@@ -0,0 +1,65 @@
+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.
+
+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/channel/channel_stack.h --> GRPC_INTERNAL_CORE_CHANNEL_CHANNEL_STACK_H
+
+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_
+- enumeration values and #define names are uppercased, all others are lowercased
+- Multiple word identifiers use underscore as a delimiter (NEVER camel casing)