16 Stimmen

Gibt es eine Möglichkeit, Makros mit einer variablen Argumentliste in Visual C++ zu schreiben?

Soweit ich weiß, können Sie in gcc etwas wie schreiben:

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

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

24voto

Gareth Simpson Punkte 34803

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

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

Eine vollständige Referenz ist aquí .

4voto

Mark Punkte 9728

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

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

und die variablen Argumente für das Makro werden als '...'-Arg an die Funktion übergeben, wo sie dann mit va_args ausgewertet werden können.

Es kann zu merkwürdigem Verhalten kommen bei VA_ARGS und die Verwendung von Makros. Weil VA_ARGS ist variabel, d.h. es kann 0 Argumente geben. Das kann dazu führen, dass Sie an einer Stelle, an der Sie es nicht beabsichtigt haben, ein Komma anhängen.

4voto

yrp Punkte 4467

Wenn Sie keine Nicht-Standard-Erweiterungen verwenden wollen, müssen Sie zusätzliche Klammern vorsehen:

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

1voto

Das, wonach Sie suchen, heißt [variadische Makros]( http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)) .

Zusammenfassung des Links: ja, ab VC++ 2005 aufwärts.

1voto

bk1e Punkte 23191

Wenn Sie eigentlich keine der Funktionen von Makros benötigen ( __FILE__ , __LINE__ , Token-Pasting, etc.), sollten Sie in Erwägung ziehen, eine variadische Funktion zu schreiben, die stdargs.h . Anstatt die printf() kann eine variadische Funktion aufrufen vprintf() um variable Argumentlisten weiterzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X