Domanda

Per quanto ne so, in gcc puoi scrivere qualcosa del tipo:

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

C'è un modo per farlo in VC++?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top