Difference between revisions of "Coding Style"
(→Spacing) |
(→File structure and modularity) |
||
Line 74: | Line 74: | ||
===File structure and modularity=== | ===File structure and modularity=== | ||
− | Source files (.cc files) should | + | Source files (.cc files) should '''never''' contain extern declarations; instead, include the header file associated with the .cc file in which the object is defined. This header file should contain extern declarations for all objects exported from that .cc file. This header should also be included in the defining .cc file. The key here is that we have a single external declaration in the .hh file that the compiler will automatically check for consistency with the .cc file. (This isn't as important in C++ as it was in C, since linker name mangling will now catch these errors, but it's still a good idea.) |
+ | |||
When sufficient (i.e., when declaring only pointers or references to a class), header files should use forward class declarations instead of including full header files. | When sufficient (i.e., when declaring only pointers or references to a class), header files should use forward class declarations instead of including full header files. | ||
+ | |||
+ | Header files should '''never''' contain <code>using</code> declarations at the top level. This forces all the names in that namespace into the global namespace of any source file including that header file, which basically completely defeats the point of using namespaces. It is OK to use <code>using</code> declarations at the top level of a source (.cc) file since the effect is entirely local to that .cc file. It's also OK to use them in _impl.hh files, since for practical purposes these are source (not header) files despite their extension. | ||
===Documenting the code=== | ===Documenting the code=== | ||
Each file/class/member should be documented using doxygen style comments. The documentation style to use is presented here: [[Documentation Guidelines]] | Each file/class/member should be documented using doxygen style comments. The documentation style to use is presented here: [[Documentation Guidelines]] |
Revision as of 20:36, 5 March 2009
We strive to maintain a consistent coding style in the M5 source code to make the source more readable and maintainable. This necessarily involves compromise among the multiple developers who work on this code. We feel that we have been successful in finding such a compromise, as each of the primary M5 developers is annoyed by at least one of the rules below. We ask that you abide by these guidelines as well if you develop code that you would like to contribute back to M5. An Emacs c++-mode style embodying the indentation rules is available in the source tree at util/emacs/m5-c-style.el.
Contents
Indentation and Line Breaks
Indentation will be 4 spaces per level.
- Exception: labels followed by colons (case and goto labels and public/private/protected modifiers) are indented two spaces from the enclosing context.
Indentation should use spaces only (no tabs), as tab widths are not always set consistently, and tabs make output harder to read when used with tools such as diff.
Lines must be a maximum of 78 characters long.
For control blocks (if, while, etc.), opening braces must be on the same line as the control keyword with a space between the closing parenthesis and the opening brace.
- Exception: for multi-line expressions, the opening brace may be placed on a separate line to distinguish the control block from the statements inside the block.
if (...) { ... }
'Else' keywords should follow the closing 'if' brace on the same line, as follows:
if (...) { ... } else if (...) { ... } else { ... }
For function definitions or class declarations, the opening brace must be in the first column of the following line.
In function definitions, the return type should be on one line, followed by the function name, left-justified, on the next line. As mentioned above, the opening brace should also be on a separate line following the function name.
See examples below:
int exampleFunc(...) { ... } class ExampleClass { public: ... }
Functions should be preceded by a block comment describing the function.
Inline function declarations longer than one line should not be placed inside class declarations. Most functions longer than one line should not be inline anyway.
Spacing
There should be:
- one space between keywords (if, for, while, etc.) and opening parentheses
- no space between function names and opening parentheses for arguments
- no space immediately inside parentheses, except for very complex expressions. Complex expressions are preferentially broken into multiple simpler expressions using temporary variables.
Naming
Class and type names are mixed case, start with an uppercase letter, and do not contain underscores (e.g., ClassName). Exception: names that are acronyms should be all upper case (e.g., CPU). Class member names (method and variables, including const variables) are mixed case, start with a lowercase letter, and do not contain underscores (e.g., aMemberVariable).
Local variables are lower case, with underscores separating words (e.g., local_variable).
C preprocessor symbols (constants and macros) should be all caps with underscores. However, these are deprecated, and should be replaced with const variables and inline functions, respectively, wherever possible.
File structure and modularity
Source files (.cc files) should never contain extern declarations; instead, include the header file associated with the .cc file in which the object is defined. This header file should contain extern declarations for all objects exported from that .cc file. This header should also be included in the defining .cc file. The key here is that we have a single external declaration in the .hh file that the compiler will automatically check for consistency with the .cc file. (This isn't as important in C++ as it was in C, since linker name mangling will now catch these errors, but it's still a good idea.)
When sufficient (i.e., when declaring only pointers or references to a class), header files should use forward class declarations instead of including full header files.
Header files should never contain using
declarations at the top level. This forces all the names in that namespace into the global namespace of any source file including that header file, which basically completely defeats the point of using namespaces. It is OK to use using
declarations at the top level of a source (.cc) file since the effect is entirely local to that .cc file. It's also OK to use them in _impl.hh files, since for practical purposes these are source (not header) files despite their extension.
Documenting the code
Each file/class/member should be documented using doxygen style comments. The documentation style to use is presented here: Documentation Guidelines