Node:Presentation locale, Next:, Previous:Conventions de nommage, Up:Top



Présentation locale

Indentation et espacements locaux

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.

Espacement des blocs

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()
{
}

Déclarations et fonctions

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)
{
}
Pour passer plus d'informations à une fonction, il vaut mieux utiliser une structure et passer un pointeur vers une instance de cette structure.

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.

Sauts et `switch'

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.

Directives préprocesseur et commentaires

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