Auslassungspunkte ...

Es ist möglich, Makros zu definieren mit einer variablen Anzahl an Parametern. Diese sogenannt variadischen Makros werden mit drei Auslassungspunkten ... definiert, worauf die damit vertretenen Parameter in der Makrodefinition mit dem vordefinierten Makro __VA_ARGS__ angesprochen werden können.

#include <stdio.h> #define PRINT(string, ...) printf(string, __VA_ARGS__) int main(){ PRINT("The error %d occured.", 99); return 0; }

The error 99 occured.

Details

Man kann anstelle des Makros __VA_ARGS__ einen eigenen Namen für die variadischen Parameter 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 Parameterangabe 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 Parameter, 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:

#define PRINT(string, args ...) printf(string, args) PRINT("Some kind of error occured.");

printf("Some kind of error occured.", );

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

#define PRINT(string, args ...) printf(string, ## args) PRINT("Some kind of error occured.");

printf("Some kind of error occured.");