|
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 if s, 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>
|