| Title: Apache Developers' C Language Style Guide |
| license: https://www.apache.org/licenses/LICENSE-2.0 |
| |
| # Apache Developers' C Language Style Guide |
| |
| **Compiled by Paul Sutton [paul@awe.com](mailto:paul@awe.com)**. Based on |
| a vote taken in November, 1996. |
| Further refinements voted upon in July 1997. |
| |
| # Introduction # |
| |
| [This bit could state that code should be laid out to be clear to someone |
| else familiar with Apache. Functions should be short and easily understood. |
| Comments should be provided to explain the rationale for code which is not |
| obvious, and to document behavior of functions. The guidelines can be |
| broken if necessary to achieve a clearer layout] |
| |
| This style can be generated with the following arguments to GNU indent: |
| |
| ``` |
| -i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 -nut |
| ``` |
| |
| # The Guidelines # |
| |
| - Opening braces are given on the same lines as statements, or on the |
| following line at the start of a function definition. |
| - Code inside a block (whether surrounded by braces or not) is indented by |
| four space characters. Tab characters are not used. Comments are indented to |
| the same level as the surrounding code. |
| - Closing braces are always on a separate line from surrounding code, and are |
| indented to line up with the start of the text on the line containing the |
| corresponding opening brace. |
| - Functions are declared with ANSI-style arguments. |
| - There is no space between the function name and the opening bracket of the |
| arguments to the function. There is a single space following commas in |
| argument lists and the semi-colons in for statements. |
| - Inside a `switch()` statement, the `case` keywords are indented to the same |
| level as the `switch` line. |
| - Operators in expressions should be surrounded by a single space before and |
| after, except for unary increment (++), decrement (--), and negation (!) operators. |
| - There is no whitespace between a cast and the item modified (*e.g.*, |
| "`(int)j`" and not "`(int) j`"). |
| - If a cast is to a pointer type, there is a space between the type and |
| the `*` character (*e.g.*, "`(char *)i`" instead of "`(char*)i`") |
| |
| # Details and Examples # |
| |
| ## **Indentation, General Style** |
| |
| Each level of indentation of code is four spaces. Tab characters should |
| never be used. Specific indentation rules for function declarations and |
| control-flow keywords are given below. |
| |
| Example: |
| |
| ```c |
| main(int argc, char **argc) |
| { |
| if (argc != 0) { |
| fprintf(stderr, "No arguments allowed\n"); |
| exit(1); |
| } |
| exit(0); |
| } |
| ``` |
| |
| <a id="long-exps"></a>If an expression (or a routine declaration or |
| invocation) would extend past column 80, the terms or arguments are wrapped |
| at a convenient spot and the wrapped portion is indented under the first |
| term in the expression (or the first argument to the function). Conditional |
| expressions should be wrapped to keep single or parenthesized terms as |
| atomic as possible, and place Boolean operators at either the start |
| (preferable) or end of the line. |
| |
| Example: |
| |
| ```c |
| static const char *really_long_name(int i, int j, |
| const char *args, void *foo, |
| int k) |
| ``` |
| |
| ```c |
| if (cond1 && (item2 || item3) && (!item4) |
| && (item5 || item6) && item7) { |
| do_a_thing(); |
| } |
| ``` |
| |
| |
| ## **Comments** |
| |
| Provide comments which explain the function of code where it is not clear |
| from the code itself. Provide rationale where necessary for particular bits |
| of code. |
| |
| Comments should be indented to same level as the surrounding text. |
| |
| Example: |
| |
| ```c |
| code; |
| /* comment */ |
| code; |
| ``` |
| |
| |
| ## **Function Declaration and Layout** |
| |
| Functions are laid out as follows: |
| |
| Example: |
| |
| ```c |
| int main(int argc, char **argv) |
| { |
| code; |
| } |
| ``` |
| |
| The return type is placed on the same line as the function. Arguments (if |
| any) are given in ANSI style. If no arguments, declare function as `void`. |
| No space between function name and opening bracket, single space after |
| comma separating each argument. The opening brace is placed on the line |
| after the definition, indented to line up with the start of the return type |
| text. The code is indented with four spaces, and the closing brace is |
| indented to line up with the opening brace. **Also see the section on |
| indenting [long declarations and invocations](#long-exps).** |
| |
| ## **Function Calls** |
| |
| Space after commas in function calls. No space between function name and |
| opening bracket. |
| |
| Example: |
| |
| ```c |
| f(a, b); |
| ``` |
| |
| **Also see the section on indenting [long declarations |
| and invocations](#long-exps).** |
| |
| ## **Flow-Control Layout** |
| |
| Flow-control statements (`if`, `while`, `for`, *etc.*) are laid out as in this |
| |
| Example: |
| |
| ```c |
| if (expr) { |
| code; |
| } |
| else { |
| code; |
| } |
| ``` |
| |
| There is a space between the keyword and the opening bracket. Opening brace |
| placed on same line as the flow keyword. The code itself is indented by four |
| spaces. The closing brace is indented to line up with the opening brace. If |
| an `else` clause is used, the `else` keyword is placed on the line following |
| the closing brace and is indented to line up with the corresponding `if`. |
| **Also see the section on indenting [long |
| expressions](#long-exps).** |
| |
| ## **`for` Layout** |
| |
| Space after the semi-colons. |
| |
| Example: |
| |
| ```c |
| for (a; b; c) |
| ``` |
| |
| |
| ## **`switch` Layout** |
| |
| `case` lines within a `switch()` are indented to same level as the switch |
| statement itself. The code for each case is indented by four spaces. |
| Braces are laid out as for other control-flow keywords. |
| |
| Example: |
| |
| ```c |
| switch (x) { |
| case a: |
| code; |
| case b: |
| code; |
| } |
| ``` |
| |
| |
| ## **Expressions** |
| |
| Space before and after assignment and other and operators. No space between |
| unary operators (increment, decrement, and negation) and the lvalue. |
| |
| Examples: |
| |
| ```c |
| a = b |
| a + b |
| a < b |
| a = -b |
| a = !b |
| ++a |
| ``` |
| |
| |
| ## **Capitalisation of Enums** |
| |
| No rule. |
| |