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

Packit 1470ea
Packit 1470ea
      xmlns:its="http://www.w3.org/2005/11/its"
Packit 1470ea
      type="topic"
Packit 1470ea
      id="c-coding-style">
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>The GTK+ Team</name>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <include href="cc-by-sa-3-0.xml" xmlns="http://www.w3.org/2001/XInclude"/>
Packit 1470ea
Packit 1470ea
    <desc>Our guidelines for C code in GNOME</desc>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>C Coding Style</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
    

Packit 1470ea
      This document is for C code.  For other languages, check the
Packit 1470ea
      <link xref="index">main page</link> of the GNOME Programming
Packit 1470ea
      Guidelines.
Packit 1470ea
    

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>The Single Most Important Rule</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      The single most important rule when writing code is this:
Packit 1470ea
      check the surrounding code and try to imitate it.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      As a maintainer it is dismaying to receive a patch that is
Packit 1470ea
      obviously in a different coding style to the surrounding code.
Packit 1470ea
      This is disrespectful, like someone tromping into a spotlessly-clean
Packit 1470ea
      house with muddy shoes.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      So, whatever this document recommends, if there is already
Packit 1470ea
      written code and you are patching it, keep its current style
Packit 1470ea
      consistent even if it is not your favorite style.
Packit 1470ea
    

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

Packit 1470ea
      Try to use lines of code between 80 and 120 characters long.
Packit 1470ea
      This amount of text is easy to fit in most monitors with a
Packit 1470ea
      decent font size.  Lines longer than that become hard to read,
Packit 1470ea
      and they mean that you should probably restructure your code.
Packit 1470ea
      If you have too many levels of indentation, it means that you
Packit 1470ea
      should fix your code anyway.
Packit 1470ea
    

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="indentation">
Packit 1470ea
    <title>Indentation</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      In general there are two preferred indentation styles for code
Packit 1470ea
      in GNOME.
Packit 1470ea
    

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

Packit 1470ea
	  Linux Kernel style.  Tabs with a length of 8 characters are
Packit 1470ea
	  used for the indentation, with K&R brace placement:
Packit 1470ea
	

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
	

Packit 1470ea
	  GNU style.  Each new level is indented by 2 spaces,
Packit 1470ea
	  braces go on a line by themselves, and they are indented as
Packit 1470ea
	  well.
Packit 1470ea
	

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
    

Packit 1470ea
      Both styles have their pros and cons.  The most important things
Packit 1470ea
      is to be consistent with the surrounding code.  For
Packit 1470ea
      example, the GTK+ library, which is GNOME’s widget toolkit, is
Packit 1470ea
      written with the GNU style.  Nautilus, GNOME’s file manager, is
Packit 1470ea
      written in Linux kernel style.  Both styles are perfectly
Packit 1470ea
      readable and consistent when you get used to them.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Your first feeling when having to study or work on a piece of
Packit 1470ea
      code that doesn’t have your preferred indentation style may be,
Packit 1470ea
      how shall we put it, gut-wrenching.  You should resist your
Packit 1470ea
      inclination to reindent everything, or to use an inconsistent
Packit 1470ea
      style for your patch.  Remember the first rule:  be
Packit 1470ea
      consistent and respectful of that code’s customs, and your
Packit 1470ea
      patches will have a much higher chance of being accepted without
Packit 1470ea
      a lot of arguing about the right indentation style.
Packit 1470ea
    

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

Packit 1470ea
      Do not ever change the size of tabs in your editor;
Packit 1470ea
      leave them as 8 spaces.  Changing the size of tabs means that
Packit 1470ea
      code that you didn’t write yourself will be perpetually misaligned.
Packit 1470ea
    

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>Braces</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Curly braces should not be used for single statement blocks:
Packit 1470ea
    

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
	

Packit 1470ea
	  The “no block for single statements” rule has only four
Packit 1470ea
	  exceptions:
Packit 1470ea
	

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
	    

Packit 1470ea
	      If the single statement covers multiple lines, e.g. for functions with
Packit 1470ea
	      many arguments, and it is followed by else or
Packit 1470ea
	      else if:
Packit 1470ea
	    

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
            

Packit 1470ea
              If the condition is composed of many lines:
Packit 1470ea
            

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
            

Packit 1470ea
              Note that such long conditions are usually hard to understand.  A
Packit 1470ea
              good practice is to set the condition to a boolean variable, with
Packit 1470ea
              a good name for that variable.  Another way is to move the long
Packit 1470ea
              condition to a function.
Packit 1470ea
            

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

Packit 1470ea
              Nested ifs, in which case the block should be placed
Packit 1470ea
              on the outermost if:
Packit 1470ea
            

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
        

Packit 1470ea
          In general, new blocks should be placed on a new indentation level,
Packit 1470ea
          like this:
Packit 1470ea
        

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
        

Packit 1470ea
          While curly braces for function definitions should rest on a
Packit 1470ea
          new line they should not add an indentation level:
Packit 1470ea
        

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>Conditions</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
    

Packit 1470ea
      The C language uses the value 0 for many purposes.  As a numeric value,
Packit 1470ea
      the end of a string, a null pointer and the FALSE boolean.
Packit 1470ea
      To make the code clearer, you should write code that highlights the
Packit 1470ea
      specific way 0 is used.  So when reading a comparison, it is possible to
Packit 1470ea
      know the variable type.  For boolean variables, an implicit comparison is
Packit 1470ea
      appropriate because it’s already a logical expression.  Other variable
Packit 1470ea
      types are not logical expressions by themselves, so an explicit
Packit 1470ea
      comparison is better:
Packit 1470ea
    

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>Functions</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Functions should be declared by placing the returned value on a
Packit 1470ea
      separate line from the function name:
Packit 1470ea
    

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>Whitespace</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Always put a space before an opening parenthesis but never after:
Packit 1470ea
    

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
    

Packit 1470ea
      When declaring a structure type use newlines to separate logical sections
Packit 1470ea
      of the structure:
Packit 1470ea
    

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
    

Packit 1470ea
      Do not eliminate whitespace and newlines just because something would
Packit 1470ea
      fit on a single line:
Packit 1470ea
    

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

Packit 1470ea
      Do eliminate trailing whitespace on any line, preferably as a separate
Packit 1470ea
      patch or commit. Never use empty lines at the beginning or at the end of
Packit 1470ea
      a file.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      This is a little Emacs function that you can use to clean up
Packit 1470ea
      lines with trailing whitespace:
Packit 1470ea
    

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>The switch Statement</title>
Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      A switch should open a block on a new
Packit 1470ea
      indentation level, and each case should start on
Packit 1470ea
      the same indentation level as the curly braces, with the case
Packit 1470ea
      block on a new indentation level:
Packit 1470ea
    

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
    

Packit 1470ea
      It is preferable, though not mandatory, to separate the various
Packit 1470ea
      cases with a newline:
Packit 1470ea
    

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 Files</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
    

Packit 1470ea
      The maximum width of each column is given by the longest element
Packit 1470ea
      in the column:
Packit 1470ea
    

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
    

Packit 1470ea
      It is also possible to align the columns to the next tab:
Packit 1470ea
    

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
    

Packit 1470ea
      As before, you can use M-x align in Emacs to do
Packit 1470ea
      this automatically.
Packit 1470ea
    

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 Classes</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
    

Packit 1470ea
      Typedef declarations should be placed at the beginning of the file:
Packit 1470ea
    

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
    

Packit 1470ea
      Interfaces must have the following macros:
Packit 1470ea
    

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

Macro

Packit 1470ea
	  

Expands to

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>Memory Allocation</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
    

Packit 1470ea
      See <link xref="memory-management"/> for more details.
Packit 1470ea
    

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="macros">
Packit 1470ea
    <title>Macros</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
    

Packit 1470ea
      Underscore-prefixed functions are never exported.
Packit 1470ea
    

Packit 1470ea
Packit 1470ea
    

Packit 1470ea
      Non-exported functions that are only needed in one source file
Packit 1470ea
      should be declared static.
Packit 1470ea
    

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