Was bedeutet __VA_ARGS__ in einem Makro?

Lesezeit: 1 Minute

Benutzeravatar von ganeshredcobra
Ganeshredcobra

/* Debugging */
#ifdef DEBUG_THRU_UART0
#   define DEBUG(...)  printString (__VA_ARGS__)
#else
void dummyFunc(void);
#   define DEBUG(...)  dummyFunc()   
#endif

Ich habe diese Notation in verschiedenen Headern der C-Programmierung gesehen, ich habe im Grunde verstanden, dass Argumente übergeben werden, aber ich habe nicht verstanden, wie diese “Drei-Punkte-Notation” heißt?

Kann jemand es anhand eines Beispiels erklären oder auch Links zu VA Args bereitstellen?

Benutzeravatar von nos
Nr

Es ist ein variadisch Makro. Das bedeutet, dass Sie es mit einer beliebigen Anzahl von Argumenten aufrufen können. Die Drei ... ist ähnlich dem gleichen Konstrukt, das in a verwendet wird variadische Funktion in C

Das heißt, Sie können das Makro so verwenden

DEBUG("foo", "bar", "baz");

Oder mit beliebig vielen Argumenten.

Das __VA_ARGS__ verweist wieder auf die Variablenargumente im Makro selbst.

#define DEBUG(...)  printString (__VA_ARGS__)
               ^                     ^
               +-----<-refers to ----+

So DEBUG("foo", "bar", "baz"); würde durch ersetzt werden printString ("foo", "bar", "baz")

Benutzeravatar von Theolodis
Theolodis

Die Punkte werden zusammen mit dem genannt __VA_ARGS__variadische Makros

Wenn das Makro aufgerufen wird, alle Token in seiner Argumentliste […]einschließlich etwaiger Kommas,
werden zum Variablenargument. Diese Folge von Token ersetzt die Kennung VA_ARGS im Makrokörper, wo immer es erscheint.

Quellekühne Betonung von mir.

Ein Anwendungsbeispiel:

#ifdef DEBUG_THRU_UART0
#   define DEBUG(...)  printString (__VA_ARGS__)
#else
void dummyFunc(void);
#   define DEBUG(...)  dummyFunc()   
#endif
DEBUG(1,2,3); //calls printString(1,2,3) or dummyFunc() depending on
              //-DDEBUG_THRU_UART0 compiler define was given or not, when compiling.

1404770cookie-checkWas bedeutet __VA_ARGS__ in einem Makro?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy