Bonjour,
Savez vous comment je pourrais redéfinir ces deux fonctions avec presque le même prototype ?
En pratique, je veux pouvoir écrire quelque chose comme :
myprintf(int a, ...)
{
if (a == 1)
printf(...)
else
{
/* TODO */
}
}
Merci
Bonjour,
Savez vous comment je pourrais redéfinir ces deux fonctions avec presque le même prototype ?
En pratique, je veux pouvoir écrire quelque chose comme :
myprintf(int a, ...)
{
if (a == 1)
printf(...)
else
{
/* TODO */
}
}
Merci
Quel est ton but de vouloir réaliser une telle chose?
printf écrit sur la sortie standard
fprintf écrit sur un flux spécifique
rajouter des if esle ne rendra que ton programme plus lents!
Le but est de pouvoir activer / desactiver toutes les sorties (standard et fichiers) en un seul coup je m'explique :
1) je définis :
#define ACTIVEPRINTF 1 //(ou 0)
2) j'écris un peu partout dans mon code
#if ACTIVEPRINTF
printf(...)
#endif
Je voudrais eviter cela partout dans le code, en ayant une fonction MyPrintf du type
MyPrintf(...)
{
#if ACTIVEPRINTF
printf(...)
#endif
}
Merci
Nicolas
Non tu ne peux pas, tu es obligé de mettre à chaque fois un #if![]()
Si j'ai bien compris tu peux tout simplement faire comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #define ACTIVEPRINTF 1 #if ACTIVEPRINTF #define MyPrintf(...) printf(__VA_ARGS__) #else #define MyPrintf(...) #endif
Personnellement, pour ce que tu cherches à faire ici, je te conseille de passer par des macros comme le propose ssmario2.
Maintenant, si tu as vraiment besoin de créer une fonction du style de printf(), je t'invite à regarder du côté des fonctions va_start(), va_arg() et va_end() ainsi que du côté de vprintf() et consœur.
L'idée de la macro me convient bien mais je n'arrive pas à la faire fonctionner correctement.
J'ai mis :
#define ACTIVEPRINTF 1
#if ACTIVEPRINTF
#define MyPrintf(__VA_ARGS__) printf(__VA_ARGS__)
#else
#define MyPrintf(__VA_ARGS__)
#endif
puis dans le main : MyPrintf("Test %d\n %0.20f\n",15, 3.14152);
et j'ai les warning suivants à la compilation ;
warning C4002: too many actual parameters for macro 'MyPrintf'
warning C4313: 'printf' : '%d' in format string conflicts with argument 1 of type 'const char *'
mais surtout un échec à l'exécution...
Merci de votre aide
Dans ta première macro il faut mettre des points (pour montrer que tu attends un nombre variable d'arguments). Dans la deuxième aussi d'ailleurs :p
Ta deuxième macro ne sert à rien lol
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #define ACTIVEPRINTF 1 #if ACTIVEPRINTF #define MyPrintf(...) printf(__VA_ARGS__) #else #define MyPrintf(...) my_printf(__VA_ARGS__) #endif
Ca ne fonctionne pas, je présume que le compilo C++ de Visual Studio n'en veut pas.
Je suis passé via les va_args avec vprintf et cela fonctionne très bien
Nicolas
Si tu as Visual C++ 2005 ou plus normalement ça devrais fonctionnerSupport for variadic macros was introduced in Visual C++ 2005.![]()
Aie, le compilo est celui de VS2003...
Ce n'est pas grave, je reste avec ma méthode...
Pourquoi ne veux-tu pas reprendre ma proposition telle quelle ?
Comme dit plus haut la macro __VA_ARGS__ n'est implémentée qu'a partir de Visual C++ 2005 mais le PO à VS 2003 donc il ne peut pas l'utiliser
http://msdn.microsoft.com/en-us/libr...15(VS.80).aspx
bah..
Une autre solution est de définir une macro PRINT
et de remplacer tous les appels à printf par PRINT
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #ifdef JE_VEUX_DES_PRINT #define PRINT((a)) printf((a)) #else #define PRINT((a)) #endif
![]()
@souviron: je ne comprends pas comment est-ce que cela pourrait fonctionner et je ne suis pas le seul :
Code : Sélectionner tout - Visualiser dans une fenêtre à part error: "(" may not appear in macro parameter list
Partager