bonjour est ce que vous pouvez m expliquer les termes fmt,stderr et __VA_ARGS__ dans l exemple suivant ,et l interet de ce macro .Pourquoi c est mieux de l utiliser au lieu de fprintf. Merci d avance.
![]()
-----
bonjour est ce que vous pouvez m expliquer les termes fmt,stderr et __VA_ARGS__ dans l exemple suivant ,et l interet de ce macro .Pourquoi c est mieux de l utiliser au lieu de fprintf. Merci d avance.
![]()
Bonjour,
Il ne s'agit pas de compilation conditionnelle.
"man 3 printf" donne des débuts de réponse.
Sinon, google...
Not only is it not right, it's not even wrong!
Bonjour
Pour produire des messages qui n'ont d'utilité que durant les phases de déboggage et de test, il est préférable de définir une macro-fonction particulière qu'il sera facile de supprimer pour générer le code final sans gêner par ailleurs l'usage normal de la fonction fprintf. Dans le cas présent, il suffira de commenter la ligne et d'en écrire une autre pour faire disparaître d'un coup cette fonctionnalité dans l'ensemble du programme :
Ici :Code:// #define DEBUG(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) #define DEBUG(fmt, ...)
• fmt est le premier argument de la macro-fonction DEBUG. Il correspond au deuxième argument de la fonction fprintf, qui précise le format du message produit.
• stderr est le flux d'erreur standard du système. Son écriture correspond à l'envoi d'un message sur la console.
• __VA_ARGS__ désigne la liste d'arguments de longueur variable représentée par les points de suspension (« ... »). Il s'agit d'un artifice qui permet de définir des fonctions dont on ne connaît pas le nombre d'arguments a priori.
Dernière modification par PA5CAL ; 19/03/2019 à 14h13.
précisions/corrections:
stderr est le 1er argument de fprintf. fprintf est de la même famille que printf et permet de préciser vers quoi il va imprimer (ici stderr qui est la sortie standard des erreurs). printf envoie d'office vers stdout...
fmt est le second argument, il défini le formatage des arguments suivants.
[HS utile] Attention, le piège classique est de faire un printf(str) quand on ne connaît pas le contenu de str, alors qu'il faut faire printf("%s", str) car str peut comporter un '%' qui va mettre la zizanie...
__VA_ARGS__ désigne la liste d'arguments de longueur variable représentée par les points de suspension (« ... »). Il s'agit d'un artifice qui permet de définir des macros dont on ne connaît pas le nombre d'arguments a priori.
sinon, un google (__VA_ARGS__) et un peu de lecture t'aurais donné toutes ces infos...
Jusqu'ici tout va bien...
Mouais... Je voulais dire que __VA_ARGS__ sert à définir la fonction utilisée pour définir la macro. En principe on n'utilise pas __VA_ARGS__ quand le nombre d'arguments de la fonction est connu a priori.
Mais ce que tu écris est juste. Comme __VA_ARGS__ représente les « ... » de la macro, en toute rigueur on pourrait aussi envisager de l'utiliser en dehors des arguments d'une fonction, par exemple :In fine, __VA_ARGS__ est utilisé pour définir la macro.Code:#define MA_LISTE_D_INSTRUCTIONS( ... ) __VA_ARGS__
Dernière modification par PA5CAL ; 21/03/2019 à 11h31.
C'est marrant, c'est la réponse du message #2
Je suis admiratif, personnellement je n'ai pas le temps de faire des réponses aussi développées. C'est toujours bien, quand on le demande, d'avoir des explications diverses.
Not only is it not right, it's not even wrong!
Jusqu'ici tout va bien...