esiste un modo per scrivere macro con un elenco di argomenti variabili in Visual C++?
-
09-06-2019 - |
Domanda
Per quanto ne so, in gcc puoi scrivere qualcosa del tipo:
#define DBGPRINT(fmt...) printf(fmt);
C'è un modo per farlo in VC++?
Soluzione
Sì, ma solo a partire da VC++ 2005.La sintassi per il tuo esempio sarebbe:
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
Un riferimento completo è Qui.
Altri suggerimenti
Sì, puoi farlo in Visual Studio C++ nelle versioni 2005 e successive (non sono sicuro di VS 2003).Dare un'occhiata a VA_ARGS.Fondamentalmente puoi fare qualcosa del genere:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
e gli argomenti variabili della macro verranno passati alla funzione fornita come '...' args, dove puoi quindi utilizzare va_args per analizzarli.
Può esserci un comportamento strano con VA_ARGS e l'uso delle macro.Perché VA_ARGS è variabile, ciò significa che possono esserci 0 argomenti.Ciò potrebbe lasciarti con virgole finali dove non volevi.
Se non desideri utilizzare estensioni non standard, devi fornire parentesi aggiuntive:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
Ciò che stai cercando si chiama [macro variadici](http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx).
Riepilogo del collegamento:sì, da VC++ 2005 in poi.
Se in realtà non hai bisogno di nessuna delle funzionalità delle macro (__FILE__
, __LINE__
, incollaggio di token, ecc.) potresti prendere in considerazione la scrittura di una funzione variadica utilizzando stdargs.h
.Invece di chiamare printf()
, una funzione variadica può chiamare vprintf()
per passare elenchi di argomenti variabili.
Per MSVC 7.1 (.NET 2003), funziona:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
Quanto segue dovrebbe funzionare.(Vedi collegamento a Macro variadiche)
(L'esempio seguente mostra argomenti fissi e variabili.)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
Cercare "VA_ARGS" e va_list in MSDN!
Quasi.Tuttavia è più brutto di così (e probabilmente non vorrai un punto e virgola finale nella macro stessa:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
Per usarlo:
DBGPRINT(("%s\n", "Hello World"));
(mancava una coppia di genitori).
Non sono sicuro del motivo per cui tutti gli aspetti negativi, la domanda originale non indicavano una versione di VC++ e le macro variadic non sono supportate da tutti i compilatori.