2008-09-15 25 views

Répondre

24

Oui, mais seulement depuis VC++ 2005. La syntaxe de votre exemple serait:

#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__) 

Une référence complète est here.

-2

Presque. Il est plus laid que si (et vous ne voulez probablement pas un point-virgule de fuite dans la macro elle-même:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')' 

Pour l'utiliser:

DBGPRINT(("%s\n", "Hello World")); 

(il manquait une paire de parens).

Je ne sais pas pourquoi tous les aspects négatifs, la question initiale ne précisaient pas une version de VC++, et les macros variadique ne sont pas pris en charge par tous les compilateurs.

+0

Persumably les downvotes étaient parce que les parens manquantes signifiait qu'il était cassé ... si remarquable, une version encore plus mal de ce là-haut a 5 upvotes. Vous avez tous manqué le simple '#define DBGPRINT printf' –

4

Oui, vous pouvez le faire dans Visual studio C++ dans les versions 2005 et suivantes (pas sûr de VS 2003). Jetez un oeil à VA_ARGS. Vous pouvez en principe faire quelque chose comme ceci:

#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__) 

et les arguments variables à la macro sera passé à la fonction fournie comme « ... » args, où vous pouvez nous va_args pour les analyser en.

Il peut y avoir un comportement étrange avec VA_ARGS et l'utilisation de macros. Parce que VA_ARGS est variable, cela signifie qu'il peut y avoir 0 arguments. Cela pourrait vous laisser avec des virgules flottantes où vous n'aviez pas l'intention.

+0

VC++ mange la virgule de fin s'il n'y a pas d'arguments, n'est-ce pas? –

0

Les éléments suivants doivent travailler (voir lien vers Variadic macros.)

(exemple ci-dessous montre un des arguments fixes et variables.)

# define DBGPRINTF(fmt,...) \ 
    do { \ 
     printf(fmt, __VA_ARGS__); \ 
    } while(0) 
0

Rechercher "VA_ARGS" et va_list dans MSDN!

4

Si vous ne souhaitez pas utiliser les extensions non standard, vous avez à fournir des supports supplémentaires:

#define DBGPRINT(args) printf(args); 
DBGPRINT(("%s\n", "Hello World")); 
+4

Ceci est tellement faux, et pourtant eu upvotes ... Je voudrais tirer quelqu'un pour le point-virgule à la fin de la définition seul. Ce que vous vouliez: '#define DBGPRINT (args) printf args' ... mais pour ce cas, juste' #define DBGPRINT printf' fera l'affaire. –

+0

#define DBGPRINT printf ne fonctionnera pas si vous voulez élider tout votre code de sortie de débogage de l'exécutable. Vous vous retrouverez avec toutes les listes de paramètres (...) et il déclenchera au moins des alertes, des erreurs et des effets secondaires inattendus. – Tomek

1

Si vous ne pas vraiment besoin des fonctionnalités de macros (__FILE__, __LINE__, jeton -pasting, etc.) vous pouvez envisager d'écrire une fonction variadique en utilisant stdargs.h. Au lieu d'appeler printf(), une fonction variadique peut appeler vprintf() afin de transmettre des listes d'arguments variables.

1

Pour MSVC 7.1 (.NET 2003), cela fonctionne:

#if defined(DETAILED_DEBUG) 
#define DBGPRINT fprintf 
#else 
__forceinline void __DBGPRINT(...){} 
#define DBGPRINT __DBGPRINT 
#endif