Blame programming-guidelines/de/c-coding-style.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="c-coding-style" xml:lang="de">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
    <link type="guide" xref="index#general-guidelines"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Federico Mena-Quintero</name>
Packit 1470ea
      <email its:translate="no">federico@gnome.org</email>
Packit 1470ea
      <years>2013</years>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Das GTK+-Team</name>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <include xmlns="http://www.w3.org/2001/XInclude" href="cc-by-sa-3-0.xml"/>
Packit 1470ea
Packit 1470ea
    <desc>Unsere Richtlinien für C-Code in GNOME</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Mario Blättermann</mal:name>
Packit 1470ea
      <mal:email>mario.blaettermann@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2016</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Christian Kirbach</mal:name>
Packit 1470ea
      <mal:email>christian.kirbach@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2016</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>C-Programmierstil</title>
Packit 1470ea
Packit 1470ea
  

Packit 1470ea
    This document presents the preferred coding style for C programs
Packit 1470ea
    in GNOME.  While coding style is very much a matter of taste, in
Packit 1470ea
    GNOME we favor a coding style that promotes consistency,
Packit 1470ea
    readability, and maintainability.
Packit 1470ea
  

Packit 1470ea
Packit 1470ea
  

Packit 1470ea
    We present examples of good coding style as well as examples of
Packit 1470ea
    bad style that is not acceptable in GNOME.  Please try to submit
Packit 1470ea
    patches that conform to GNOME’s coding style; this indicates that
Packit 1470ea
    you have done your homework to respect the project’s goal of
Packit 1470ea
    long-term maintainability.  Patches with GNOME’s coding style will
Packit 1470ea
    also be easier to review!
Packit 1470ea
  

Packit 1470ea
Packit 1470ea
  <note>
Packit 1470ea
    

Dieses Dokument bezieht sich auf C-Programmcode. Informationen zu anderen Sprachen finden Sie auf der <link xref="index">Hauptseite</link> der GNOME-Programmierrichtlinien.

Packit 1470ea
  </note>
Packit 1470ea
Packit 1470ea
  

Packit 1470ea
    These guidelines are heavily inspired by GTK’s CODING-STYLE
Packit 1470ea
    document, the Linux Kernel’s CodingStyle, and the GNU Coding
Packit 1470ea
    Standards.  These are slight variations of each other, with
Packit 1470ea
    particular modifications for each project’s particular needs and
Packit 1470ea
    culture, and GNOME’s version is no different.
Packit 1470ea
  

Packit 1470ea
Packit 1470ea
  <section id="most-important-rule">
Packit 1470ea
    <title>Die allerwichtigste Regel</title>
Packit 1470ea
Packit 1470ea
    

Die allerwichtigste Regel für das Schreiben von Code ist: Schauen Sie sich den umgebenden Code an und versuchen Sie, dessen Stil zu imitieren.

Packit 1470ea
Packit 1470ea
    

Für einen Maintainer ist es erschreckend, einen Patch zu bekommen, der vom umgebenden Code stilistisch stark abweicht. Das ist respektlos, so als jemand mit schlammigen Schuhen in ein blitzsauberes Haus hineintrampelt.

Packit 1470ea
Packit 1470ea
    

Was auch immer dieses Dokument empfiehlt, so sollte sich Ihr Stil stets am Stil des bereits vorhandenen Codes orientieren, auch wenn es nicht Ihr bevorzugter Stil ist.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="line-width">
Packit 1470ea
    <title>Zeilenbreite</title>
Packit 1470ea
Packit 1470ea
    

Versuchen Sie, Ihre Zeilen zwischen 80 und 120 Zeichen breit zu halten. Diese Breite passt am besten in die meisten Bildschirme mit einer vernünftigen Schriftgröße. Längere Zeilen sind schwerer zu lesen, außerdem sollten Sie sich in diesem Fall überlegen, ob Sie Ihren Code nicht anders beziehungsweise besser strukturieren sollten. Bei zu vielen Einrückungsebenen sollte Ihr Code ohnehin überarbeitet werden.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="indentation">
Packit 1470ea
    <title>Einzüge</title>
Packit 1470ea
Packit 1470ea
    

Allgemein gibt es zwei zu bevorzugende Einzugsstile für Code in GNOME.

Packit 1470ea
Packit 1470ea
    <list type="ordered">
Packit 1470ea
      <item>
Packit 1470ea
	

Linux-Kernel-Stil. Tabulatoren für Einrückungen sind 8 Zeichen breit, mit einer K&R-Klammernplatzierung:

Packit 1470ea
Packit 1470ea
	
Packit 1470ea
for (i = 0; i < num_elements; i++) {
Packit 1470ea
	foo[i] = foo[i] + 42;
Packit 1470ea
Packit 1470ea
	if (foo[i] < 35) {
Packit 1470ea
		printf ("Foo!");
Packit 1470ea
		foo[i]--;
Packit 1470ea
	} else {
Packit 1470ea
		printf ("Bar!");
Packit 1470ea
		foo[i]++;
Packit 1470ea
	}
Packit 1470ea
}
Packit 1470ea
      </item>
Packit 1470ea
Packit 1470ea
      <item>
Packit 1470ea
	

GNU-Stil. Jede neue Ebene wird um zwei Leerzeichen eingerückt, Klammern werden in eine eigene Zeile gesetzt und ebenfalls eingerückt.

Packit 1470ea
Packit 1470ea
	
Packit 1470ea
for (i = 0; i < num_elements; i++)
Packit 1470ea
  {
Packit 1470ea
    foo[i] = foo[i] + 42;
Packit 1470ea
Packit 1470ea
    if (foo[i] < 35)
Packit 1470ea
      {
Packit 1470ea
        printf ("Foo!");
Packit 1470ea
        foo[i]--;
Packit 1470ea
      }
Packit 1470ea
    else
Packit 1470ea
      {
Packit 1470ea
        printf ("Bar!");
Packit 1470ea
        foo[i]++;
Packit 1470ea
      }
Packit 1470ea
  }
Packit 1470ea
      </item>
Packit 1470ea
    </list>
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Beide Stile haben ihre Befürworter und Gegner. Der wichtigste Punkt ist die Konsistenz zum umgebenden Code. Zum Beispiel ist die GTK+-Bibliothek als Widget-Toolkit für GNOME im GNU-Stil geschrieben. Nautilus dagegen, der Dateimanager von GNOME, folgt dem Linux-Kernel-Stil. Beide Stile sind bestens lesbar und konsistent, wenn Sie sie verwenden.

Packit 1470ea
Packit 1470ea
    

Ihr erstes Gefühl bei der Arbeit an Programmcode, der nicht Ihrem bevorzugten Einrückungsstil folgt, könnte, sagen wir, ablehnend sein. Widerstehen Sie dem Drang, alles neu einrücken zu wollen, oder für Ihren Patch einen inkonsistenten Stil zu verwenden. Erinnern Sie sich an die oberste Regel: Konsistenz und Respekt vor den Eigenheiten des fremden Codes, und Ihre Patches haben eine ungleich größere Chance, ohne langatmige Diskussionen über den richtigen Einrückungsstil angenommen zu werden.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="tab-characters">
Packit 1470ea
    <title>Tabulatorzeichen</title>
Packit 1470ea
Packit 1470ea
    

Ändern Sie niemals die Tabulatorbreite in Ihrem Editor. Behalten Sie 8 Zeichen bei. Durch Änderungen der Tabulatorbreite wird Code, den Sie nicht selbst geschrieben haben, immer falsch ausgerichtet.

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Instead, set the indentation size as appropriate for
Packit 1470ea
      the code you are editing.  When writing in something other than
Packit 1470ea
      Linux kernel style, you may even want to tell your editor to
Packit 1470ea
      automatically convert all tabs to 8 spaces, so that there is no
Packit 1470ea
      ambiguity about the intended amount of space.
Packit 1470ea
    

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="braces">
Packit 1470ea
    <title>Klammern</title>
Packit 1470ea
Packit 1470ea
    

Geschweifte Klammern sollten nicht für einzelne Anweisungsblöcke verwendet werden:

Packit 1470ea
Packit 1470ea
Packit 1470ea
/* valid */
Packit 1470ea
if (condition)
Packit 1470ea
	single_statement ();
Packit 1470ea
else
Packit 1470ea
	another_single_statement (arg1);
Packit 1470ea
Packit 1470ea
	

Für die Regel »kein Block für einzelne Anweisungen« gibt es vier Ausnahmen:

Packit 1470ea
Packit 1470ea
	<list type="ordered">
Packit 1470ea
          <item>
Packit 1470ea
            

Packit 1470ea
              In GNU style, if either side of an if-else statement has
Packit 1470ea
              braces, both sides should, to match up indentation:
Packit 1470ea
            

Packit 1470ea
Packit 1470ea
Packit 1470ea
/* valid GNU style */
Packit 1470ea
if (condition)
Packit 1470ea
  {
Packit 1470ea
    foo ();
Packit 1470ea
    bar ();
Packit 1470ea
  }
Packit 1470ea
else
Packit 1470ea
  {
Packit 1470ea
    baz ();
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if (condition)
Packit 1470ea
  {
Packit 1470ea
    foo ();
Packit 1470ea
    bar ();
Packit 1470ea
  }
Packit 1470ea
else
Packit 1470ea
  baz ();
Packit 1470ea
          </item>
Packit 1470ea
Packit 1470ea
	  <item>
Packit 1470ea
	    

Wenn sich die einzelne Anweisung über mehrere Zeilen erstreckt, zum Beispiel für Funktionen mit vielen Argumenten, und wenn darauf else oder else if folgt:

Packit 1470ea
Packit 1470ea
Packit 1470ea
/* valid Linux kernel style */
Packit 1470ea
if (condition) {
Packit 1470ea
	a_single_statement_with_many_arguments (some_lengthy_argument,
Packit 1470ea
						another_lengthy_argument,
Packit 1470ea
						and_another_one,
Packit 1470ea
						plus_one);
Packit 1470ea
} else
Packit 1470ea
	another_single_statement (arg1, arg2);
Packit 1470ea
Packit 1470ea
/* valid GNU style */
Packit 1470ea
if (condition)
Packit 1470ea
  {
Packit 1470ea
    a_single_statement_with_many_arguments (some_lengthy_argument,
Packit 1470ea
                                            another_lengthy_argument,
Packit 1470ea
                                            and_another_one,
Packit 1470ea
                                            plus_one);
Packit 1470ea
  }
Packit 1470ea
else
Packit 1470ea
  {
Packit 1470ea
    another_single_statement (arg1, arg2);
Packit 1470ea
  }
Packit 1470ea
          </item>
Packit 1470ea
Packit 1470ea
          <item>
Packit 1470ea
            

Wenn die Bedingung aus mehreren Zeilen besteht:

Packit 1470ea
Packit 1470ea
Packit 1470ea
/* valid Linux kernel style */
Packit 1470ea
if (condition1 ||
Packit 1470ea
    (condition2 && condition3) ||
Packit 1470ea
    condition4 ||
Packit 1470ea
    (condition5 && (condition6 || condition7))) {
Packit 1470ea
	a_single_statement ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* valid GNU style */
Packit 1470ea
if (condition1 ||
Packit 1470ea
    (condition2 && condition3) ||
Packit 1470ea
    condition4 ||
Packit 1470ea
    (condition5 && (condition6 || condition7)))
Packit 1470ea
  {
Packit 1470ea
    a_single_statement ();
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
            

Bedenken Sie, dass solche überlangen Bedingungen oft schwer verständlich sind. Eine gute Alternative wäre, die Bedingung in eine boolesche Variable zu setzen und einen passenden Namen dafür zu wählen. Eine weitere Möglichkeit ist die Auslagerung der langen Bedingung in eine Funktion.

Packit 1470ea
          </item>
Packit 1470ea
Packit 1470ea
          <item>
Packit 1470ea
            

Verschachtelte ifs, wobei der Block im äußersten if platziert werden sollte:

Packit 1470ea
Packit 1470ea
Packit 1470ea
/* valid Linux kernel style */
Packit 1470ea
if (condition) {
Packit 1470ea
	if (another_condition)
Packit 1470ea
		single_statement ();
Packit 1470ea
	else
Packit 1470ea
		another_single_statement ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* valid GNU style */
Packit 1470ea
if (condition)
Packit 1470ea
  {
Packit 1470ea
    if (another_condition)
Packit 1470ea
      single_statement ();
Packit 1470ea
    else
Packit 1470ea
      another_single_statement ();
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if (condition)
Packit 1470ea
	if (another_condition)
Packit 1470ea
		single_statement ();
Packit 1470ea
	else if (yet_another_condition)
Packit 1470ea
		another_single_statement ();
Packit 1470ea
          </item>
Packit 1470ea
        </list>
Packit 1470ea
Packit 1470ea
        

Generell sollten neue Blöcke in eine neue Einrückungsebene gesetzt werden, wie hier:

Packit 1470ea
Packit 1470ea
        
Packit 1470ea
int retval = 0;
Packit 1470ea
Packit 1470ea
statement_1 ();
Packit 1470ea
statement_2 ();
Packit 1470ea
Packit 1470ea
{
Packit 1470ea
	int var1 = 42;
Packit 1470ea
	gboolean res = FALSE;
Packit 1470ea
Packit 1470ea
	res = statement_3 (var1);
Packit 1470ea
Packit 1470ea
	retval = res ? -1 : 1;
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
        

Während geschweifte Klammern für Funktionsdefinitionen in eine neue Zeile gehören, sollten sie nicht weiter eingerückt werden:

Packit 1470ea
Packit 1470ea
        
Packit 1470ea
/* valid Linux kernel style*/
Packit 1470ea
static void
Packit 1470ea
my_function (int argument)
Packit 1470ea
{
Packit 1470ea
	do_my_things ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* valid GNU style*/
Packit 1470ea
static void
Packit 1470ea
my_function (int argument)
Packit 1470ea
{
Packit 1470ea
  do_my_things ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
static void
Packit 1470ea
my_function (int argument) {
Packit 1470ea
	do_my_things ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
static void
Packit 1470ea
my_function (int argument)
Packit 1470ea
  {
Packit 1470ea
    do_my_things ();
Packit 1470ea
  }
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="conditions">
Packit 1470ea
    <title>Bedingungen</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Do not check boolean values for equality.  By using implicit
Packit 1470ea
      comparisons, the resulting code can be read more like conversational
Packit 1470ea
      English.  Another rationale is that a ‘true’ value may not be necessarily
Packit 1470ea
      equal to whatever the TRUE macro uses.  For example:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* invalid */
Packit 1470ea
if (found == TRUE)
Packit 1470ea
	do_foo ();
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if (found == FALSE)
Packit 1470ea
	do_bar ();
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* valid */
Packit 1470ea
if (found)
Packit 1470ea
	do_foo ();
Packit 1470ea
Packit 1470ea
/* valid */
Packit 1470ea
if (!found)
Packit 1470ea
	do_bar ();
Packit 1470ea
Packit 1470ea
    

Die Programmiersprache C verwendet den Wert 0 für zahlreiche Zwecke, als numerischen Wert, als Ende einer Zeichenkette, als Null-Zeiger oder für den booleschen Wert FALSE. Um hier etwas mehr Klarheit zu schaffen, sollte in Ihrem Code der Zwecke entsprechend gekennzeichnet werden. So kann bei Vergleichen der Variablentyp erkannt werden. Für boolesche Variablen ist ein impliziter Vergleich angemessen, da es bereits ein logischer Ausdruck ist. Andere Variablentypen sind nicht direkt logische Ausdrücke, so dass ein expliziter Vergleich besser erscheint:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* valid */
Packit 1470ea
if (some_pointer == NULL)
Packit 1470ea
	do_blah ();
Packit 1470ea
Packit 1470ea
/* valid */
Packit 1470ea
if (number == 0)
Packit 1470ea
	do_foo ();
Packit 1470ea
Packit 1470ea
/* valid */
Packit 1470ea
if (str != NULL && *str != '\0')
Packit 1470ea
	do_bar ();
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* invalid */
Packit 1470ea
if (!some_pointer)
Packit 1470ea
	do_blah ();
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if (!number)
Packit 1470ea
	do_foo ();
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if (str && *str)
Packit 1470ea
	do_bar ();
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="functions">
Packit 1470ea
    <title>Funktionen</title>
Packit 1470ea
Packit 1470ea
    

Funktionen sollten so deklariert werden, dass der Rückgabewert in einer separaten Zeile vom Funktionsnamen abgesetzt wird:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
void
Packit 1470ea
my_function (void)
Packit 1470ea
{
Packit 1470ea
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      The argument list must be broken into a new line for each
Packit 1470ea
      argument, with the argument names right aligned, taking into
Packit 1470ea
      account pointers:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
void
Packit 1470ea
my_function (some_type_t      type,
Packit 1470ea
             another_type_t  *a_pointer,
Packit 1470ea
             double_ptr_t   **double_pointer,
Packit 1470ea
             final_type_t     another_type)
Packit 1470ea
{
Packit 1470ea
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      If you use Emacs, you can use M-x align to do this
Packit 1470ea
      kind of alignment automatically.  Just put the point and mark
Packit 1470ea
      around the function’s prototype, and invoke that command.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      The alignment also holds when invoking a function without breaking the
Packit 1470ea
      line length limit:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
align_function_arguments (first_argument,
Packit 1470ea
                          second_argument,
Packit 1470ea
                          third_argument);
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="whitespace">
Packit 1470ea
    <title>Leerzeichen</title>
Packit 1470ea
Packit 1470ea
    

Setzen Sie stets vor einer öffnenden Klammer ein Leerzeichen, aber niemals dahinter:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* valid */
Packit 1470ea
if (condition)
Packit 1470ea
	do_my_things ();
Packit 1470ea
Packit 1470ea
/* valid */
Packit 1470ea
switch (condition) {
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if(condition)
Packit 1470ea
	do_my_things();
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
if ( condition )
Packit 1470ea
	do_my_things ( );
Packit 1470ea
Packit 1470ea
    

Bei der Deklaration eines Strukturtyps verwenden Sie einen Zeilenumbruch, um logische Abschnitte der Struktur zu trennen:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
struct _GtkWrapBoxPrivate
Packit 1470ea
{
Packit 1470ea
	GtkOrientation        orientation;
Packit 1470ea
	GtkWrapAllocationMode mode;
Packit 1470ea
Packit 1470ea
	GtkWrapBoxSpreading   horizontal_spreading;
Packit 1470ea
	GtkWrapBoxSpreading   vertical_spreading;
Packit 1470ea
Packit 1470ea
	guint16               vertical_spacing;
Packit 1470ea
	guint16               horizontal_spacing;
Packit 1470ea
Packit 1470ea
	guint16               minimum_line_children;
Packit 1470ea
	guint16               natural_line_children;
Packit 1470ea
Packit 1470ea
	GList                *children;
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
    

Entfernen Sie keine Leerzeichen und Zeilenumbrücke, nur weil etwas auch in eine einzelne Zeile passen würde:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* invalid */
Packit 1470ea
if (condition) foo (); else bar ();
Packit 1470ea
Packit 1470ea
    

Entfernen Sie stets angehängte Leerzeichen in jeder Zeile, vorzugsweise mittels separatem Patch oder Commit. Setzen Sie niemals leere Zeilen an den Anfang oder das Ende einer Datei.

Packit 1470ea
Packit 1470ea
    

Hier ist eine kleine Emacs-Funktion, mit der Sie Zeilen mit angehängten Leerzeichen bereinigen können:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
(defun clean-line-ends ()
Packit 1470ea
  (interactive)
Packit 1470ea
  (if (not buffer-read-only)
Packit 1470ea
      (save-excursion
Packit 1470ea
	(goto-char (point-min))
Packit 1470ea
	(let ((count 0))
Packit 1470ea
	  (while (re-search-forward "[ 	]+$" nil t)
Packit 1470ea
	    (setq count (+ count 1))
Packit 1470ea
	    (replace-match "" t t))
Packit 1470ea
	  (message "Cleaned %d lines" count)))))
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="switch">
Packit 1470ea
    <title>Die switch-Anweisung</title>
Packit 1470ea
Packit 1470ea
    

Ein switch sollte einen Block in einer neuen Einrückungsebene öffnen, und jedes case sollte in der gleichen Einrückungsebene beginnen wie die geschweiften Klammern, mit dem case-Block in einer neuen Einrückungsebene:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* valid Linux kernel style */
Packit 1470ea
switch (condition) {
Packit 1470ea
case FOO:
Packit 1470ea
	do_foo ();
Packit 1470ea
	break;
Packit 1470ea
Packit 1470ea
case BAR:
Packit 1470ea
	do_bar ();
Packit 1470ea
	break;
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* valid GNU style */
Packit 1470ea
switch (condition)
Packit 1470ea
  {
Packit 1470ea
  case FOO:
Packit 1470ea
    do_foo ();
Packit 1470ea
    break;
Packit 1470ea
Packit 1470ea
  case BAR:
Packit 1470ea
    do_bar ();
Packit 1470ea
    break;
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
switch (condition) {
Packit 1470ea
  case FOO: do_foo (); break;
Packit 1470ea
  case BAR: do_bar (); break;
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
switch (condition)
Packit 1470ea
  {
Packit 1470ea
  case FOO: do_foo ();
Packit 1470ea
    break;
Packit 1470ea
  case BAR: do_bar ();
Packit 1470ea
    break;
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
/* invalid */
Packit 1470ea
switch (condition)
Packit 1470ea
  {
Packit 1470ea
    case FOO:
Packit 1470ea
    do_foo ();
Packit 1470ea
    break;
Packit 1470ea
    case BAR:
Packit 1470ea
    do_bar ();
Packit 1470ea
    break;
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
    

Es ist zu bevorzugen, jedoch nicht obligatorisch, die verschiedenen case durch Zeilenumbrüche voneinander zu trennen:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
switch (condition) {
Packit 1470ea
case FOO:
Packit 1470ea
	do_foo ();
Packit 1470ea
	break;
Packit 1470ea
Packit 1470ea
case BAR:
Packit 1470ea
	do_bar ();
Packit 1470ea
	break;
Packit 1470ea
Packit 1470ea
default:
Packit 1470ea
	do_default ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      The break statement for the default case is not
Packit 1470ea
      mandatory.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      If switching over an enumerated type, a case statement must
Packit 1470ea
      exist for every member of the enumerated type. For members you do not
Packit 1470ea
      want to handle, alias their case statements to
Packit 1470ea
      default:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
switch (enumerated_condition) {
Packit 1470ea
case HANDLED_1:
Packit 1470ea
	do_foo ();
Packit 1470ea
	break;
Packit 1470ea
Packit 1470ea
case HANDLED_2:
Packit 1470ea
	do_bar ();
Packit 1470ea
	break;
Packit 1470ea
Packit 1470ea
case IGNORED_1:
Packit 1470ea
case IGNORED_2:
Packit 1470ea
default:
Packit 1470ea
	do_default ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      If most members of the enumerated type should not be handled, consider
Packit 1470ea
      using an if statement instead of a switch.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      If a case block needs to declare new variables, the same rules as the
Packit 1470ea
      inner blocks apply (see above); the break statement should be placed
Packit 1470ea
      outside of the inner block:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
/* valid GNU style */
Packit 1470ea
switch (condition)
Packit 1470ea
  {
Packit 1470ea
  case FOO:
Packit 1470ea
    {
Packit 1470ea
      int foo;
Packit 1470ea
Packit 1470ea
      foo = do_foo ();
Packit 1470ea
    }
Packit 1470ea
    break;
Packit 1470ea
Packit 1470ea
Packit 1470ea
  }
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="header-files">
Packit 1470ea
    <title>Header-Dateien</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      The only major rule for headers is that the function definitions
Packit 1470ea
      should be vertically aligned in three columns:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
return_type          function_name           (type   argument,
Packit 1470ea
                                              type   argument,
Packit 1470ea
                                              type   argument);
Packit 1470ea
Packit 1470ea
    

Die maximale Breite jeder Spalte wird durch das längste Element in der Spalte bestimmt:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
void         gtk_type_set_property (GtkType      *type,
Packit 1470ea
                                    const gchar  *value,
Packit 1470ea
                                    GError      **error);
Packit 1470ea
const gchar *gtk_type_get_property (GtkType      *type);
Packit 1470ea
Packit 1470ea
    

Es ist auch möglich, die Spalten am nächsten Tabulator auszurichten:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
void          gtk_type_set_prop           (GtkType *type,
Packit 1470ea
                                           gfloat   value);
Packit 1470ea
gfloat        gtk_type_get_prop           (GtkType *type);
Packit 1470ea
gint          gtk_type_update_foobar      (GtkType *type);
Packit 1470ea
Packit 1470ea
    

Wie schon erwähnt, erledigt Emacs dies mit M-x align automatisch.

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      If you are creating a public library, try to export a single
Packit 1470ea
      public header file that in turn includes all the smaller header
Packit 1470ea
      files into it.  This is so that public headers are never
Packit 1470ea
      included directly; rather a single include is used in
Packit 1470ea
      applications.  For example, GTK+ uses the following in its
Packit 1470ea
      header files that should not be included directly by
Packit 1470ea
      applications:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
Packit 1470ea
#error "Only <gtk/gtk.h> can be included directly."
Packit 1470ea
#endif
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      For libraries, all headers should have inclusion guards (for
Packit 1470ea
      internal usage) and C++ guards.  These provide the extern
Packit 1470ea
      "C" magic that C++ requires to include plain C headers:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
#ifndef MYLIB_FOO_H_
Packit 1470ea
#define MYLIB_FOO_H_
Packit 1470ea
Packit 1470ea
#include <gtk/gtk.h>
Packit 1470ea
Packit 1470ea
G_BEGIN_DECLS
Packit 1470ea
Packit 1470ea
Packit 1470ea
Packit 1470ea
G_END_DECLS
Packit 1470ea
Packit 1470ea
#endif /* MYLIB_FOO_H_ */
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="gobject">
Packit 1470ea
    <title>GObject-Klassen</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      GObject class definitions and implementations require some
Packit 1470ea
      additional coding style notices, and should always be
Packit 1470ea
      <link xref="namespacing#gobject">correctly namespaced</link>.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Typedef-Deklarationen sollten am Anfang der Datei platziert werden:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
typedef struct _GtkBoxedStruct       GtkBoxedStruct;
Packit 1470ea
typedef struct _GtkMoreBoxedStruct   GtkMoreBoxedStruct;
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      This includes enumeration types:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
typedef enum
Packit 1470ea
{
Packit 1470ea
  GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT,
Packit 1470ea
  GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH
Packit 1470ea
} GtkSizeRequestMode;
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      And callback types:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
typedef void (* GtkCallback) (GtkWidget *widget,
Packit 1470ea
                              gpointer   user_data);
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Instance structures should be declared using
Packit 1470ea
      G_DECLARE_FINAL_TYPE or
Packit 1470ea
      G_DECLARE_DERIVABLE_TYPE:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
#define GTK_TYPE_FOO (gtk_foo_get_type ())
Packit 1470ea
G_DECLARE_FINAL_TYPE (GtkFoo, gtk_foo, GTK, FOO, GtkWidget)
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      For final types, private data can be stored in the object struct, which
Packit 1470ea
      should be defined in the C file:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
struct _GtkFoo
Packit 1470ea
{
Packit 1470ea
  GObject   parent_instance;
Packit 1470ea
Packit 1470ea
  guint     private_data;
Packit 1470ea
  gpointer  more_private_data;
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      For derivable types, private data must be stored in a private struct in
Packit 1470ea
      the C file, configured using G_DEFINE_TYPE_WITH_PRIVATE()
Packit 1470ea
      and accessed using a _get_instance_private() function:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
#define GTK_TYPE_FOO gtk_foo_get_type ()
Packit 1470ea
G_DECLARE_DERIVABLE_TYPE (GtkFoo, gtk_foo, GTK, FOO, GtkWidget)
Packit 1470ea
Packit 1470ea
struct _GtkFooClass
Packit 1470ea
{
Packit 1470ea
  GtkWidgetClass parent_class;
Packit 1470ea
Packit 1470ea
  void (* handle_frob)  (GtkFrobber *frobber,
Packit 1470ea
                         guint       n_frobs);
Packit 1470ea
Packit 1470ea
  gpointer padding[12];
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Always use the G_DEFINE_TYPE(),
Packit 1470ea
      G_DEFINE_TYPE_WITH_PRIVATE(), and
Packit 1470ea
      G_DEFINE_TYPE_WITH_CODE() macros, or their abstract variants
Packit 1470ea
      G_DEFINE_ABSTRACT_TYPE(),
Packit 1470ea
      G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(),
Packit 1470ea
      and G_DEFINE_ABSTRACT_TYPE_WITH_CODE(); also, use the similar
Packit 1470ea
      macros for defining interfaces and boxed types.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Interface types should always have the dummy typedef for cast
Packit 1470ea
      purposes:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
typedef struct _GtkFooable          GtkFooable;
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      The interface structure should have ‘Interface’ postfixed to the
Packit 1470ea
      dummy typedef:
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
typedef struct _GtkFooableInterface     GtkFooableInterface;
Packit 1470ea
Packit 1470ea
    

Für Schnittstellen sind die folgenden Makros zu verwenden:

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
      
Packit 1470ea
	
Packit 1470ea
	  

Makro

Packit 1470ea
	  

Expandiert zu

Packit 1470ea
	
Packit 1470ea
      
Packit 1470ea
      
Packit 1470ea
	
Packit 1470ea
	  

GTK_TYPE_iface_name

Packit 1470ea
	  

iface_name_get_type

Packit 1470ea
	
Packit 1470ea
	
Packit 1470ea
	  

GTK_iface_name

Packit 1470ea
	  

G_TYPE_CHECK_INSTANCE_CAST

Packit 1470ea
	
Packit 1470ea
	
Packit 1470ea
	  

GTK_IS_iface_name

Packit 1470ea
          

G_TYPE_CHECK_INSTANCE_TYPE

Packit 1470ea
	
Packit 1470ea
	
Packit 1470ea
	  

GTK_iface_name_GET_IFACE

Packit 1470ea
          

G_TYPE_INSTANCE_GET_INTERFACE

Packit 1470ea
	
Packit 1470ea
      
Packit 1470ea
    
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="memory-allocation">
Packit 1470ea
    <title>Speicherreservierung</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      When dynamically allocating data on the heap use g_new().
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Public structure types should always be returned after being
Packit 1470ea
      zero-ed, either explicitly for each member, or by using
Packit 1470ea
      g_new0().
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

In <link xref="memory-management"/> finden Sie weitere Details.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="macros">
Packit 1470ea
    <title>Makros</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Try to avoid private macros unless strictly necessary. Remember
Packit 1470ea
      to #undef them at the end of a block or a series of functions
Packit 1470ea
      needing them.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Inline functions are usually preferable to private macros.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Public macros should not be used unless they evaluate to a
Packit 1470ea
      constant.
Packit 1470ea
    

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="public-api">
Packit 1470ea
    <title>Public API</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Avoid exporting variables as public API, since this is
Packit 1470ea
      cumbersome on some platforms. It is always preferable to add
Packit 1470ea
      getters and setters instead.  Also, beware global variables in
Packit 1470ea
      general.
Packit 1470ea
    

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="private-api">
Packit 1470ea
    <title>Private API</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Non-exported functions that are needed in more than one source file
Packit 1470ea
      should be prefixed with an underscore (‘_’), and declared in a
Packit 1470ea
      private header file.  For example, _mylib_internal_foo().
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Funktionen mit vorangestelltem Unterstrich werden niemals exportiert.

Packit 1470ea
Packit 1470ea
    

Nicht-exportierte Funktionen, die nur in einer Quelldatei benötigt werden, sollten als statisch deklariert werden.

Packit 1470ea
  </section>
Packit 1470ea
</page>