star-style

Writing conventions for co-authors
Log | Files | Refs | README | LICENSE

commit 8db64be3270e96124c728519309986adddaec756
parent 0843b37d530f906704cbc9e50cf99eb81825bcd4
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 16 Jul 2026 18:03:44 +0200

Ajoute la section sur les macros

Diffstat:
Mdoc/fr/star-c.7 | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+), 0 deletions(-)

diff --git a/doc/fr/star-c.7 b/doc/fr/star-c.7 @@ -1334,6 +1334,108 @@ structuré en suivant la convention de nommage des déclarations typedef .Pq section Sx Les déclarations de types . .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .Sh LES MACROS +Regrouper la séquence d'instructions d'une macro dans un bloc terminé +par l'instruction +.Ql (void)0 . +Elle peut ainsi être utilisée comme unique expression d'une structure de +contrôle, et force l'ajout d'un point virgule +.Ql \&; +.Pq ou d'une virgule Ql \&, +après son utilisation, telle n'importe quelle autre instruction C. +Utiliser un +.Ql (void)0 +terminal, plutôt que la structure de contrôle +.Ql do { ... } while(0) +plus courante, évite les avertissements de compilation émis par certains +compilateur quant à l'utilisation d'une expression conditionnelle +constante. +.Pp +Ouvrir le bloc sur la même ligne que le nom de la macro et indenter son +contenu par rapport à sa directive de définition. +Justifer à droite les caractères anti-slash +.Ql \e +en fin de chaque ligne de sorte à faciliter la lecture de la séquence +d'instructions développée par la macro : +.Bd -literal -offset Ds +#define FOO(X, Y) { \e + if ((X) == (Y)) printf("Bar \en"); \e + (Y) += 2; \e +} (void)0 +.Ed +.Pp +À noter que dans l'exemple qui précède, les caractères anti-slash +.Ql \e +sont alignés en suivant des contraintes d'édition propres à ce manuel. +Dans un fichier source, positioner l'anti-slash en tant que dernier +caractère de lignes qui occupent la longueur maximale autorisée +.Pq section Sx LA LONGUER DES LIGNES . +.Pp +Pour une macro dont la portée est l'unité de compilation, ne pas changer +le déroulé des instructions de son contexte d'appel, par exemple en +intégrant une directive +.Ql return . +Son utilisation contredirait l'exécution séquentielle du code et ce +faisant nuirait à sa lisibilité. +Il n'est donc +.Em pas +recommandé de définir une macro comme suit : +.Bd -literal -offset Ds +#define FOO(X) { + if (bar(X)) + return -1; +} (void)0 +.Ed +.Pp +Ne pas présupposer l'existance de variables externes à la macro, +exeption faite des variables globales. +L'objet étant de ne pas lier son bon fonctionnement au contexte local +dans lequel elle est développée. +L'écriture qui suit est donc +.Em découragée Ns + : +.Bd -literal -offset Ds +#define BAR(X,Y) { + z = (X) + (Y); + if (xyzzy(z)) + z += 1; +} +.Ed +.Pp +Contrairement aux macros définies à l'échelle d'une unité de +compilation, une macro locale peut non seulement changer le fil +d'exécution du contexte d'appel, mais aussi utiliser des variables +externes. +Et ce précisément en raison de son caractère local, qui lie étroitement +la macro à son seul contexte d'utilisation. +.Bd -literal -offset Ds +static res_T +foo(const int x) +{ + char s[10] = {0}; + res_T res = RES_OK; + + #define CALL(Func) { + if((res=(Func)) != RES_OK) goto error; + } (void)0 + CALL(bar(x, s)); + CALL(quux(s)); + #undef CALL + +exit: + return res; +error: + fprinf(stderr, "error: %s\en", res_to_cstr(res)); + goto exit; +} +.Ed +.Pp +Pour définir une séquence d'instructions, +préférer l'utilisation de fonctions aux macros. +Déclarer la fonction avec la directive +.Sy INLINE +si son coût d'appel est un enjeu +.Pq section Sx Les symboles internes à une unité de compilation . +.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .Sh LES ALLOCATIONS DYNAMIQUES .Sh LA GESTION DES ERREURS .Sh LES PROGRAMME EN LIGNE DE COMMANDE