Question

Autant que je sache, vous pouvez écrire dans gcc quelque chose comme:

#define DBGPRINT(fmt...) printf(fmt);

Existe-t-il un moyen de faire cela dans VC ++?

Était-ce utile?

La solution

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

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

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

Autres conseils

Oui, vous pouvez le faire dans Visual Studio C ++ dans les versions 2005 et ultérieures (vous n'êtes pas sûr de VS 2003). Consultez VA_ARGS . Vous pouvez fondamentalement faire quelque chose comme ceci:

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

et les arguments variables de la macro seront transmis à la fonction fournie sous la forme d'arguments '...', où vous pouvez ensuite nous utiliser va_args pour les analyser.

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 argument. Cela pourrait vous laisser avec des virgules de fin lorsque vous ne vouliez pas.

Si vous ne souhaitez pas utiliser d'extensions non standard, vous devez fournir des crochets supplémentaires:

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

Ce que vous recherchez s'appelle [macros variadiques] ( http://msdn.microsoft.com/en-us/library/ms177415 (VS.80) .aspx) .

Résumé du lien: oui, à partir de VC ++ 2005 à partir de maintenant.

Si vous n'avez réellement besoin d'aucune des fonctionnalités des macros ( __ FILE __ , __ LINE __ , collage de jetons, etc.), vous pouvez envisager d'écrire une variable fonction avec stdargs.h . Au lieu d'appeler printf () , une fonction variadique peut appeler vprintf () afin de transmettre des listes d'arguments variables.

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

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

Ce qui suit devrait fonctionner. (Voir le lien vers les Macros Variadic .

(L'exemple ci-dessous montre un argument fixe et variable.)

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

Recherchez " VA_ARGS ". et va_list dans MSDN!

Presque. C’est plus moche que ça (et vous ne voulez probablement pas d’un point-virgule 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).

Vous ne savez pas pourquoi tous les négatifs, la question initiale ne précisait pas de version de VC ++ et les macros variadiques ne sont pas prises en charge par tous les compilateurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top