Frage

Soweit ich weiß, in gcc kann man so etwas schreiben:

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

Gibt es eine Möglichkeit, dass in VC zu tun ++?

War es hilfreich?

Lösung

Ja, aber erst seit VC ++ 2005. Die Syntax für Ihr Beispiel wäre:

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

Eine vollständige Referenz hier .

Andere Tipps

Ja, Sie können dies tun, in Visual Studio C ++ in den Versionen 2005 und darüber hinaus (nicht sicher VS 2003). Werfen Sie einen Blick auf VA_ARGS . Sie können im Grunde so etwas tun:

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

und die variablen Argumente an das Makro wird auf die Funktion als ‚...‘ args zur Verfügung gestellt bekommen geleitet, wo Sie können uns dann va_args sie zu analysieren, aus.

Es kann seltsames Verhalten sein mit VA_ARGS und der Verwendung von Makros. Da VA_ARGS variabel ist, das bedeutet, dass es 0 Argumente sein. Das könnte Sie mit nachfolgendem Komma verlassen, wo Sie nicht beabsichtigen.

Wenn Sie keine Nicht-Standard-Erweiterungen verwenden möchten, haben Sie zusätzliche Klammern bieten:

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

Was Sie suchen sind aufgerufen [variadische Makros] ( http://msdn.microsoft.com/en-us/library/ms177415 (VS.80) .aspx) .

Zusammenfassung des Link:. Ja, von VC ++ 2005 auf bis

Wenn Sie nicht eigentlich gar keines der Merkmale von Makros müssen (__FILE__, __LINE__, Token-Einfügen, etc.) können Sie eine variadische Funktion Schreiben mit stdargs.h zu betrachten. Stattdessen printf() des Aufrufs, eine variadische Funktion vprintf() um entlang variable Argumentlisten zu übergeben aufrufen können.

Für MSVC 7.1 (.NET 2003), das funktioniert:

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

In der folgenden sollte funktionieren. (Siehe Link zu Variadische Makros )

(Beispiel unten zeigt eine feste und variable Argumente.)

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

Suche nach " VA_ARGS " und va_list in MSDN!

Fast. Es ist hässlicher als dass, obwohl (und Sie wahrscheinlich einen nachlauf Semikolon im Makro selbst nicht wollen:

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

Um es zu verwenden:

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

(wurde ein Paar von Pars fehlt).

Nicht sicher, warum alle die Negative, die ursprüngliche Frage nicht eine Version von VC ++ und variadische Makros werden nicht von allen Compilern angegeben habe, unterstützt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top