Makro-Parameter ...

Es ist möglich, Makros zu definieren, welche eine variable Anzahl an Argumenten erwarten. Diese sogenannt variadischen Makros werden mit drei Auslassungspunkten ... definiert, worauf die damit vertretenen Argumente in der Makrodefinition mit dem vordefinierten Makro __VA_ARGS__ angesprochen werden können.





The error 99 occured.
#include <stdio.h>
#define PRINT(string, ...) printf(string, __VA_ARGS__)

int main(){
  PRINT("The error %d occured.", 99);
  return 0;
}

Details

Es sei darauf hingewiesen, dass in C und C++ nicht nur variadische Makros, sondern auch variadische Funktionen existieren.

Die drei Auslassungspunkte werden im Englischen als ellipsis bezeichnet. Auf Deutsch entspricht dies dem Begriff Ellipse.

Anstelle des Makros __VA_ARGS__ kann auch ein eigener Name für die zusätzlichen Argumente vergeben werden. Dieses Feature ist erst ab C++ beschrieben, heutige Compiler erlauben dies jedoch auch für C-Dateien. Die Benennung wird erreicht, indem bei der Parameterliste der Makrodefinition vor die Auslassungspunkte ... der gewünschten Namen angegeben wird:

#define PRINT(string, args...) printf(string, args)

Wird ein variadisches Makro ohne die zusätzlichen Argumente verwendet, so werden diese leider nicht automatisch weggelassen, ein Aufruf obigen Makros kann somit zu einem Syntax-Fehler führen, wie in der Übersetzung der folgenden Zeile durch den Preprozessor zu sehen ist:


printf("Error!", );
#define PRINT(string, args ...) printf(string, args)
PRINT("Error!");

Um diesen Fehler zu vermeiden, bietet GCC eine Spezial-Version des doppelten Hash-Zeichens ##, welches bewirkt, dass bei nicht vorhandene Argumente variadischen Makros automatisch zusammen mit dem vorangehenden Komma (funktioniert nur mit Komma!) entfernt werden, worauf der Preprozessor die Zeile korrekt umsetzt:


printf("Error!");
#define PRINT(string, args ...) printf(string, ## args)
PRINT("Error!");