Bonjour,
je développe en ce moment un module de gestion d'erreurs pour un IDE (petite pub: http://cworkshop.sourceforge.net/index.html). J'aimerais fournir une fonction qui affiche, en plus d'un message d'information sur une erreur, un maximum d'informations sur la provenance de l'erreur. J'utilise donc les macros standards __FILE__, __LINE__ et __func__. Je crée une fonction qui prend en paramètre le nom du fichier, la ligne et la fonction concernés, plus le texte à afficher et qui affiche tout ça. Puis je définis une macro qui fait que l'utilisateur a juste à préciser le texte qu'il souhaite voir afficher.
Ca donne quelque chose comme ça:
Aucun soucis jusque-là. Maintenant, j'aimerais permettre aux développeurs de fournir des chaînes formatées à la printf. Donc le prototype de ma fonction devient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void fonction (char *file, int line, char *func, char *text); #define macro(text) fonction(__FILE__, __LINE__, __func__, text)
Le problème, c'est que je ne peux pas transposer ça à une macro. J'ai donc envisager deux solutions:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 void fonction (char *file, int line, char *func, char *text, ...);
1 - Créer une macro distincte pour chaque nombre d'arguments:
2 - Créer une fonction qui prend un nombre quelconque d'argument et renvoie une va_list:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #define macro0(text) ... #define macro1(text, arg1) ... #define macro2(text, arg1, arg2) ...
Inconvénient du premier: pas générique. Je peux créer par défaut 3 ou 4 macros, mais si jamais un développeur a besoin de beaucoup d'informations lors de sa séance de debuggage, il va par exemple créer une macro qui a besoin de 8 arguments. Sans compter si il a besoin au dernier moment de rajouter ou d'enlever quelques arguments .. on risque de vite devoir créer des macros pour aller jusqu'à 20 arguments. Celà dit une fois que c'est fait, c'est plus à faire, et ce cas est assez rare.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 va_list args_to_va_list (char truc, ...); #define macro(text, list) ... /* utilisation */ macro ("%s:%d\", args_to_va_list (0, texte, valeur));
Inconvénient du deuxième: écriture assez lourde et exigeante pour le développeur (alors que je suis sensé lui facilité la tâche).
Solution intermédiaire: fournir des macros pour 0 à 3 arguments comme suggéré dans le premier cas, et fournir la macro du second cas aussi, pour les gros cas.
Voilà, j'en appelais à vous pour savoir ce que vous pensiez de tout ça, si vous avez déjà eu ce genre de désagrément et auquel cas, savoir comment vous vous en étiez sorti. Si vous avez d'autres solutions je suis preneur.
Partager