Existe-t-il un moyen d'écrire des macros avec une liste d'arguments variables dans Visual C ++?
-
09-06-2019 - |
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 ++?
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.