Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
private:codingstyle [2013/04/18 22:44] Patrick Wacker angelegt |
private:codingstyle [2013/04/19 15:07] (aktuell) Patrick Wacker dies und das |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | |||
| + | |||
| + | //80 characters line - the + is at character 74 | ||
| + | |||
| + | --------------------------------------------------------------------------+----- | ||
| + | |||
| + | //the following line starts with a tabulator | ||
| + | |||
| + | < tab! | ||
| + | |||
| + | |||
| + | ====== Version 1 ====== | ||
| + | short explanation | ||
| + | ################################################################################ | ||
| + | |||
| ====== Coding Style ====== | ====== Coding Style ====== | ||
| - | This documents discripes the coding style I prefer in the most cases | + | ==== Introduction ==== |
| + | |||
| + | This documents describes the coding style I prefer in the most cases | ||
| and most other situations as well. | and most other situations as well. | ||
| In general I like the coding style of the linux kernel and most parts | In general I like the coding style of the linux kernel and most parts | ||
| of the descriptions made here are identical to the linux kernel. | of the descriptions made here are identical to the linux kernel. | ||
| + | |||
| + | === Editing this document === | ||
| + | |||
| + | The text for this document is written with the syntax that dokuwiki supports. | ||
| + | See https://www.dokuwiki.org for more details. | ||
| + | |||
| + | But this document should be easily readable as plain text as well. So do not | ||
| + | use any fancy looking html outputs. | ||
| + | |||
| + | Only the following dokuwiki syntax options should be used: | ||
| + | |||
| + | <code> | ||
| + | **text** for bold text | ||
| + | __text__ for underlined text | ||
| + | ==== header ==== for chapters | ||
| + | </code> | ||
| + | |||
| + | each code example must be indented with a tabulator! (not spaces!)\\ | ||
| + | [This is automatically displayed as code examples!] | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ====== Version 2 ====== | ||
| + | mostly from: http://techbase.kde.org/Policies/Kdelibs_Coding_Style | ||
| + | ################################################################################ | ||
| + | |||
| + | |||
| + | ===== Coding style ===== | ||
| + | |||
| + | This documents describes the coding style I prefer. Coding style is very | ||
| + | personal, and I won't force my views on anybody, but this is what goes for | ||
| + | anything that I have to be able to maintain, and I'd prefer it for most | ||
| + | other things too. | ||
| + | |||
| + | Please at least consider the points made here. | ||
| + | |||
| + | |||
| + | ==== Indentation ==== | ||
| + | |||
| + | * use tabs for indentation | ||
| + | * tabs are 8 characters, and thus indentations are also 8 characters. | ||
| + | |||
| + | ==== Variable declaration ==== | ||
| + | |||
| + | * Each new word in a variable name starts with a capital letter\\ (so-called camelCase) | ||
| + | * Avoid abbreviations | ||
| + | * Take usefull names. No short names, except: | ||
| + | * singe character variable names can denote counters and temporary\\ variables whose purpose is obvious | ||
| + | * Variables and functions start with a lowercase letter | ||
| + | |||
| + | ==== Whitespace ==== | ||
| + | |||
| + | * Use blank lines to group statements | ||
| + | * Use only one empty line | ||
| + | * Use one space after each keyword | ||
| + | * For pointers or references, use a single space before '*' or '&', but not after | ||
| + | * No space after a cast | ||
| + | |||
| + | ==== Braces ==== | ||
| + | |||
| + | As a base rule, the left curly brace goes in the same line as the start of the statement. | ||
| + | |||
| + | Example: | ||
| + | // wrong | ||
| + | if (true) | ||
| + | { | ||
| + | } | ||
| + | |||
| + | // correct | ||
| + | if (true) { | ||
| + | } | ||
| + | |||
| + | Exception: Function implemnetations, class, struct and namespace declarations always have the opening brace in the start of a line. | ||
| + | |||
| + | Example: | ||
| + | void debug(int i) | ||
| + | { | ||
| + | qDebug("foo: %i", i); | ||
| + | } | ||
| + | |||
| + | class Debug | ||
| + | { | ||
| + | }; | ||
| + | |||
| + | |||
| + | Do not unnecessarily use braces where a single statement will do. | ||
| + | |||
| + | if (condition) | ||
| + | action(); | ||
| + | |||
| + | and | ||
| + | |||
| + | if (condition) | ||
| + | do_this(); | ||
| + | else | ||
| + | do_that(); | ||
| + | |||
| + | This does not apply if one branch of a conditional statement is a | ||
| + | single statement. Use braces in both branches. | ||
| + | |||
| + | if (condition) { | ||
| + | do_this(); | ||
| + | do_that(); | ||
| + | } else { | ||
| + | otherwise(); | ||
| + | } | ||
| + | |||
| + | |||
| + | ==== Switch statements ==== | ||
| + | |||
| + | Case labels are on the same column as the switch | ||
| + | |||
| + | switch (myEnum) { | ||
| + | case Value1: | ||
| + | doSomething(); | ||
| + | break; | ||
| + | case Value2: | ||
| + | doSomethingElse(); | ||
| + | /* fall through */ | ||
| + | default: | ||
| + | defaultHandling(); | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | ==== Line breaks ==== | ||
| + | |||
| + | Try to keep lines shorter than 80 characters, insert line breaks as necessary. | ||
| + | |||
| + | Long strings are as well broken into shorter strings. The exception to this | ||
| + | is where exceeding 80 columns significantly increases readability and does | ||
| + | not hide information. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ====== Version 3 ====== | ||
| + | mostly from linux kernel | ||
| + | ################################################################################ | ||
| + | |||
| + | |||
| + | ===== Coding style ===== | ||
| + | |||
| + | This documents describes the coding style I prefer. Coding style is very | ||
| + | personal, and I won't force my views on anybody, but this is what goes for | ||
| + | anything that I have to be able to maintain, and I'd prefer it for most | ||
| + | other things too. | ||
| + | |||
| + | Please at least consider the points made here. | ||
| + | |||
| + | |||
| + | ==== Indentation ==== | ||
| + | |||
| + | Tabs are 8 characters, and thus indentations are also 8 characters. | ||
| + | |||
| + | Rationale: The whole idea behind indentation is to clearly define where | ||
| + | a block of control starts and ends. Especially when you've been looking | ||
| + | at your screen for many hours, you'll find it a lot easier to see how | ||
| + | the indentation works if you have large indentations. | ||
| + | |||
| + | Now, some people will claim that having 8-character indentations makes | ||
| + | the code move too far to the right, and makes it hard to read on a | ||
| + | 80-character terminal screen. The answer to that is that if you need | ||
| + | more than 3 levels of indentation, you're screwed anyway, and should fix | ||
| + | your program. | ||
| + | |||
| + | In short, 8-char indents make things easier to read, and have the added | ||
| + | benefit of warning you when you're nesting your functions too deep. | ||
| + | Heed that warning. | ||
| + | |||
| + | The preferred way to ease multiple indentation levels in a switch statement is | ||
| + | to align the "switch" and its subordinate "case" labels in the same column | ||
| + | instead of "double-indenting" the "case" labels. E.g.: | ||
| + | |||
| + | switch (suffix) { | ||
| + | case 'G': | ||
| + | case 'g': | ||
| + | mem <<= 30; | ||
| + | break; | ||
| + | case 'M': | ||
| + | case 'm': | ||
| + | mem <<= 20; | ||
| + | break; | ||
| + | case 'K': | ||
| + | case 'k': | ||
| + | mem <<= 10; | ||
| + | /* fall through */ | ||
| + | default: | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | |||
| + | Don't put multiple statements on a single line unless you have | ||
| + | something to hide: | ||
| + | |||
| + | if (condition) do_this; | ||
| + | do_something_everytime; | ||
| + | |||
| + | Don't put multiple assignments on a single line either. Avoid | ||
| + | tricky expressions. | ||
| + | |||
| + | Outside of comments and documentation, spaces are never used for | ||
| + | indentation, and the above example is deliberately broken. | ||
| + | |||
| + | Get a decent editor and don't leave whitespace at the end of lines. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Breaking long lines and strings ==== | ||
| + | |||
| + | Coding style is all about readability and maintainability using commonly | ||
| + | available tools. | ||
| + | |||
| + | The limit on the length of lines is 80 columns but this is not a strong | ||
| + | limit. | ||
| + | |||
| + | Statements longer than 80 columns should be broken into sensible chunks. | ||
| + | Descendants are always substantially shorter than the parent and are placed | ||
| + | aligned to the opening brace of the previous line. The same applies to | ||
| + | function headers with a long argument list. Long strings are as well broken | ||
| + | into shorter strings. The exception to this is where exceeding 80 columns | ||
| + | significantly increases readability and does not hide information. | ||
| + | |||
| + | void fun(int a, int b, int c) | ||
| + | { | ||
| + | if (condition) | ||
| + | qWarning("This is a long Warning message with 3 " | ||
| + | "parameters a: %u b: %u and c: %u", | ||
| + | a, b, c); | ||
| + | else | ||
| + | next_statement; | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Placing Braces and Spaces ==== | ||
| + | |||
| + | The other issue that always comes up in C styling is the placement of | ||
| + | braces. Unlike the indent size, there are few technical reasons to | ||
| + | choose one placement strategy over the other, but the preferred way, as | ||
| + | shown to us by the prophets Kernighan and Ritchie, is to put the opening | ||
| + | brace last on the line, and put the closing brace first, thusly: | ||
| + | |||
| + | if (x is true) { | ||
| + | we do y | ||
| + | } | ||
| + | |||
| + | This applies to all non-function statement blocks (if, switch, for, | ||
| + | while, do). E.g.: | ||
| + | |||
| + | switch (action) { | ||
| + | case ADD: | ||
| + | return "add"; | ||
| + | case REMOVE: | ||
| + | return "remove"; | ||
| + | case CHANGE: | ||
| + | return "change"; | ||
| + | default: | ||
| + | return NULL; | ||
| + | } | ||
| + | |||
| + | However, there is one special case, namely functions: they have the | ||
| + | opening brace at the beginning of the next line, thus: | ||
| + | |||
| + | int function(int x) | ||
| + | { | ||
| + | body of function | ||
| + | } | ||
| + | |||
| + | Heretic people all over the world have claimed that this inconsistency | ||
| + | is ... well ... inconsistent, but all right-thinking people know that | ||
| + | (a) K&R are __right__ and (b) K&R are right. Besides, functions are | ||
| + | special anyway (you can't nest them in C/C++). | ||
| + | |||
| + | Note that the closing brace is empty on a line of its own, __except__ in | ||
| + | the cases where it is followed by a continuation of the same statement, | ||
| + | ie a "while" in a do-statement or an "else" in an if-statement, like | ||
| + | this: | ||
| + | |||
| + | do { | ||
| + | body of do-loop | ||
| + | } while (condition); | ||
| + | |||
| + | and | ||
| + | |||
| + | if (x == y) { | ||
| + | .. | ||
| + | } else if (x > y) { | ||
| + | ... | ||
| + | } else { | ||
| + | .... | ||
| + | } | ||
| + | |||
| + | Rationale: K&R. | ||
| + | |||
| + | Also, note that this brace-placement also minimizes the number of empty | ||
| + | (or almost empty) lines, without any loss of readability. Thus, as the | ||
| + | supply of new-lines on your screen is not a renewable resource, you have | ||
| + | more empty lines to put comments on. | ||
| + | |||
| + | Do not unnecessarily use braces where a single statement will do. | ||
| + | |||
| + | if (condition) | ||
| + | action(); | ||
| + | |||
| + | and | ||
| + | |||
| + | if (condition) | ||
| + | do_this(); | ||
| + | else | ||
| + | do_that(); | ||
| + | |||
| + | This does not apply if one branch of a conditional statement is not a | ||
| + | single statement. Use braces in both branches. | ||
| + | |||
| + | if (condition) { | ||
| + | do_this(); | ||
| + | do_that(); | ||
| + | } else { | ||
| + | otherwise(); | ||
| + | } | ||
| + | |||
| + | |||
| + | === Spaces === | ||
| + | |||
| + | Use of spaces depends (mostly) on function-versus-keyword usage. Use a space | ||
| + | after (most) keywords. The notable exceptions are sizeof, typeof, alignof, | ||
| + | and __attribute__, which look somewhat like functions (and are usually used | ||
| + | with parentheses in Linux, although they are not required in the language, | ||
| + | as in: "sizeof info" after "struct fileinfo info;" is declared). | ||
| + | |||
| + | So use a space after these keywords: | ||
| + | |||
| + | if, switch, case, for, do, while | ||
| + | |||
| + | but not with sizeof, typeof, alignof. E.g.: | ||
| + | |||
| + | s = sizeof(struct file); | ||
| + | |||
| + | Do not add spaces around (inside) parenthesized expressions. | ||
| + | This example is **bad**: | ||
| + | |||
| + | s = sizeof( struct file ); | ||
| + | |||
| + | When declaring pointer data or a function that returns a pointer type, the | ||
| + | preferred use of '*' is adjacent to the data name or function name and not | ||
| + | adjacent to the type name. Examples: | ||
| + | |||
| + | char *banner; | ||
| + | unsigned long long memparse(char *ptr, char **retptr); | ||
| + | char *match_strdup(substring_t *s); | ||
| + | |||
| + | Use one space around (on each side of) most binary and ternary operators, | ||
| + | such as any of these: | ||
| + | = + - < > * / % | & ^ <= >= == != ? : | ||
| + | |||
| + | but no space after unary operators: | ||
| + | & * + - ~ ! sizeof typeof alignof defined | ||
| + | |||
| + | no space before the postfix increment & decrement unary operators: | ||
| + | ++ -- | ||
| + | |||
| + | no space after the prefix increment & decrement unary operators: | ||
| + | ++ -- | ||
| + | |||
| + | and no space around the '.' and "->" structure member operators. | ||
| + | |||
| + | Do not leave trailing whitespace at the ends of lines. Some editors with | ||
| + | "smart" indentation will insert whitespace at the beginning of new lines as | ||
| + | appropriate, so you can start typing the next line of code right away. | ||
| + | However, some such editors do not remove the whitespace if you end up not | ||
| + | putting a line of code there, such as if you leave a blank line. As a result, | ||
| + | you end up with lines containing trailing whitespace. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | --------------------------------------------------------------------------+----- | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| Zeile 13: | Zeile 424: | ||
| + | ====== Version 4 ====== | ||
| + | original linux kernel | ||
| + | ################################################################################ | ||