This file describes the coding style used in most C files in the Open
vSwitch distribution. However, Linux kernel code datapath directory
-follows the Linux kernel's established coding conventions.
+follows the Linux kernel's established coding conventions. For the
+Windows kernel datapath code, use the coding style described in
+datapath-windows/CodingStyle.
+
+The following GNU indent options approximate this style:
+
+ -npro -bad -bap -bbb -br -blf -brs -cdw -ce -fca -cli0 -npcs -i4 -l79 \
+ -lc79 -nbfda -nut -saf -sai -saw -sbi4 -sc -sob -st -ncdb -pi4 -cs -bs \
+ -di1 -lp -il0 -hnl
+
BASICS
should omit a null-pointer check. We find that this usually makes
code easier to read.
+Functions in .c files should not normally be marked "inline", because
+it does not usually help code generation and it does suppress
+compilers warnings about unused functions. (Functions defined in .h
+usually should be marked inline.)
+
FUNCTION PROTOTYPES
network protocol fields or in other circumstances where the exact
format is important.
- Declare bit-fields to be type "unsigned int" or "signed int". Do
-*not* declare bit-fields of type "int": C89 allows these to be either
-signed or unsigned according to the compiler's whim. (A 1-bit
-bit-field of type "int" may have a range of -1...0!) Do not declare
-bit-fields of type _Bool or enum or any other type, because these are
-not portable.
+ Declare bit-fields to be signed or unsigned integer types or _Bool
+(aka bool). Do *not* declare bit-fields of type "int": C99 allows
+these to be either signed or unsigned according to the compiler's
+whim. (A 1-bit bit-field of type "int" may have a range of -1...0!)
Try to order structure members such that they pack well on a system
with 2-byte "short", 4-byte "int", and 4- or 8-byte "long" and pointer
C DIALECT
- Some C99 features are OK because they are widely implemented:
+ Most C99 features are OK because they are widely implemented:
* Flexible array members (e.g. struct { int foo[]; }).
* bool and <stdbool.h>, but don't assume that bool or _Bool can
only take on the values 0 or 1, because this behavior can't be
simulated on C89 compilers.
+ Also, don't assume that a conversion to bool or _Bool follows
+ C99 semantics. I.e. use "(bool)(some_value != 0)" rather than
+ "(bool)some_value". The latter might produce unexpected results
+ on non-C99 environments. For example, if bool is implemented as
+ a typedef of char and some_value = 0x10000000.
* Designated initializers (e.g. "struct foo foo = {.a = 1};" and
"int a[] = {[2] = 5};").
- Don't use other C99 features that are not widely implemented in
-older compilers:
-
- * Don't mix declarations and code within a block.
+ * Mixing of declarations and code within a block. Please use this
+ judiciously; keep declarations nicely grouped together in the
+ beginning of a block if possible.
- * Don't use declarations in iteration statements (e.g. don't write
+ * Use of declarations in iteration statements (e.g.
"for (int i = 0; i < 10; i++)").
- * Don't put a trailing comma in an enum declaration (e.g. don't
- write "enum { x = 1, };").
+ * Use of a trailing comma in an enum declaration (e.g.
+ "enum { x = 1, };").
As a matter of style, avoid // comments.