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.

Man kann anstelle des Makros __VA_ARGS__ einen eigenen Namen für die variadischen Argumente vergeben. Dieses Feature ist erst ab C++ beschrieben, heutige Compiler erlauben dies jedoch auch für C-Dateien. Die Benennung wird erreicht, indem man bei der Parameterliste der Makrodefinition vor die Auslassungspunkte ... den gewünschten Namen angibt:

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

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


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 nicht vorhandene variadische Argumente 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!");