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:
| M | doc/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