Node:Presentation locale, Next:Presentation globale, Previous:Conventions de nommage, Up:Top
L'indentation autorisée est celle obtenue avec Emacs avec sa
configuration standard.
int get_type(char type_char) { t_types *types; for (types = types_tab; types->type_val; ++types) if (types->type_name == type_char) return types->type_val; return -1; } |
On passe toujours à la ligne après les accolades ou une
structure de contrôle. On indente toujours après les accolades.
if (cp) return (cp); /* Incorrect */ if (cp) {return (cp);} /* Incorrect */ if (cp) /* Correct */ { return (cp); } if (cp) /* Correct */ { return (cp); } |
La quantité d'espaces d'indentation peut varier, mais on préférera deux espaces.
Il faut un espace après ,
et ;
.
Il ne faut pas d'espace, ni avant, ni après, les opérateurs unaires
préfixes et suffixes (++
, *
, ++
et --
,
-
...).
Il faut un espace avant et après les opérateurs binaires,
y compris les opérateurs d'affectation.
x+=10*++x; /* Incorrect */ x += 10 * ++x; /* Correct */ |
Les mots-clef du C doivent toujours être suivis par
un espace, même avant un point-virgule. En revanche,
lors d'un appel de fonction le nom de fonction est collé à
la parenthèse ouvrante :
void *xmalloc(size_t n) { void *p; p = malloc(n); if (p == 0) { fprintf(stderr, "Virtual memory exhausted.\n"); exit(1); } return p; } |
Attention, return
est un mot-clef, tandis que
exit
n'en est pas un.
Une ligne ne doit pas dépasser 80 caractères de largeur.
Dans un bloc de fonction, les déclarations doivent être
séparés du code par une ligne vide. Pour rajouter des
espacements supplémentaires, il faut soit créer de nouveaux
blocs, soit découper la fonctions en plusieurs fonctions,
soit créer des macros.
int foo(int fd, char **checkboard) { int i, j; char c; for (i = 0; i < 8; ++i) for (j = 0; j < 8; ++j) { read(fd, &c, 1); checkboard[i][j] = c; } } |
On fera attention à avoir des fonctions courtes et claires, de 25 lignes maximum (entre les 2 accolades). On évitera aussi d'avoir plus de 5 fonctions par fichier, une serait l'idéal. Plus de précisions sur ces points se trouvent dans la section Code density and documentation du standard.
Les appels à la fonction assert
ne sont pas
comptabilisés dans le compte des lignes.
Il ne doit pas y avoir de commentaires dans les fonctions. Si il y a
besoin de commentaires, ils doivent se trouver avant la
fonction.
/* ** this function computes .... */ void *dummy() { } |
Les fonctions devraient prendre moins de 4 arguments, qui
doivent être déclarés avec la syntaxe ANSI :
type func(type1 p1, type2 p2, type3 p3) { } /* voire... */ type func(type1 p1, type2 p2, type3 p3) { } |
En C, ce sont les variables qui pointent vers les données,
il n'y a pas de "type pointeur". De ce fait, on accole
*
au nom de variable, et pas au type :
const char *str; /* Correct */ const char* str; /* Incorrect */ |
Il faut aligner les déclarations entre elles, et avec le nom de la fonction. On évitera aussi de déclarer plusieurs variables sur la même ligne.
Les variables ne peuvent pas être déclarées et initialisées
en même temps, sauf s'il s'agit d'une variable locale avec
l'attribut static
.
int foo() { int i; /* Correct */ int x; char y; /* Incorrect */ i = 0; /* l'initialisation après la déclaration */ } |
Les noms de champs dans une structure ou une union doivent
être alignés avec le nom de la structure :
struct s_point { int x; int y; long color; }; |
De même, les valeurs d'énumération doivent apparaître
chacune sur une ligne, alignées avec le nom de
l'énumération :
enum e_boolean { b_true, b_false }; |
Par ailleurs, les fonctions ne doivent pas renvoyer de structures ni d'unions, ni en prendre en argument.
L'instruction goto
est interdite.
On ne peut utiliser switch
que sur des types
énumération. et un bloc
switch
doit obligatoirement contenir le cas
default
s'il n'y a pas de case
pour toutes les
valeurs de l'énumération.
Par ailleurs, tous les blocs case
du switch
doivent se terminer par break
.
Enfin, on indentera comme suit :
switch (c) { case c_x: foo(); break ; case c_y: bar(); break ; default: break ; } |
On n'utilisera pas return
dans un switch
, sauf
sous certaines conditions très précises spécifiées dans le
standard.
Le symbole #
doit apparaître sur la première
colonne, et on préfèrera indenter les #if
et
#ifdef
comme suit :
#ifndef DEV_BSIZE # ifdef BSIZE # define DEV_BSIZE BSIZE # else /* !BSIZE */ # define DEV_BSIZE 4096 # endif /* !BSIZE */ #endif /* !DEV_BSIZE */ |
On préfèrera écrire les commentaires en anglais, sans faute. Un commentaire ne devrait pas comporter qu'une seule ligne (si le commentaire est court, c'est qu'il ne devrait même pas y avoir d'explication).
Les commentaires doivent être présentés comme suit :
/* * Incorrect */ /* Incorrect */ /* ** Correct */ |