Funktionen mit unbestimmter Anzahl von Argumenten in C
Normalerweise ist die Zahl der Argumente einer Funktion genau festgelegt. Dadurch kann der C -Compiler es bereits bei der Übersetzung erkennen, wenn eine falsche Zahl von Argumenten verwendet wurde. In C gibt es aber einige Funktionen, deren Argument-Anzahl nicht genau festgelegt ist.
So kann man bei einigen Funktionen beispielsweise beliebig viele Argumente angeben, es wird nur verlangt, daß mindestens ein Argument verwendet wird. Das erste Argument dient dann oft dazu, der Funktion mitzuteilen, welche weiteren Argumente sie noch zu erwarten hat.
Bei der Funktion "printf" muß das ersten Argument ein Text sein. Dieser Text kann Formatspezifizierer enthalten, die man an dem einleitenden Prozentzeichen "%" erkennen kann.
Das folgende Beispiel zeigt einen Aufruf der Funktion "printf" mit einem Argument. Der Text des ersten Arguments wird von der Funktion "printf" in der Regel ausgegeben. Daher gibt das Beispielprogramm "vararg.c" die Zeile "Hallo!" aus.
vararg.c
#include <stdio.h>
int main()
{ printf( "Hallo!\n" ); }stdout
Hallo!
Das Programm "vararg1.c" zeigt einen Aufruf der Funktion "printf" mit zwei Argumenten. Das erste Argument enthält einen Formatspezifizierer "%d", der ein weiteres Argument verlangt, das die an dieser Stelle in dezimaler Darstellung auszugebende Zahl bestimmt.
vararg1.c
#include <stdio.h>
int main()
{ printf( "Hallo, %d!\n", 5 ); }stdout
Hallo, 5!
Das Programm "vararg2.c" zeigt einen Aufruf der Funktion "printf" mit drei Argumenten. Das erste Argument enthält zwei Formatspezifizierer "%d", die jeweils ein weiteres Argument verlangen, das die an dieser Stelle in dezimaler Darstellung auszugebende Zahl bestimmt.
vararg2.c
#include <stdio.h>
int main()
{ printf( "Hallo, %d und %d!\n", 5, 6 ); }stdout
Hallo, 5 und 6!
Eine Funktion mit variabler Zahl von Argumenten muß nicht unbedingt Formatspezifizierer verwenden, um die Zahl der Argumente eines Aufrufs festzulegen. Auch andere Mittel sind für diesen Zweck denkbar. Jedenfalls muß der Funktion irgendwie eine Information übergeben werden, aus der sie entnehmen kann, wieviele Argumente der Aufruf hat, da diese Information der Funktion nicht bereits implizit übergeben wird.
Es ist ein Fehler, wenn in einem Aufruf der Funktion "printf" zwei Formatspezifizierer vorkommen, aber nur ein weiteres Argument angegeben wird, wie in dem Beispieltext "varargs3.txt".
vararg3.txt
#include <stdio.h>
int main()
{ printf( "Hallo, %d und %d!\n", 5 ); }
Da ein C -Compiler das erste Argument des Aufrufs zur Übersetzungszeit nicht immer bereits kennt, kann ein C -Compiler solche Fehler nicht immer erkennen und melden. Aus ähnlichen Gründen kann ein C -Compiler auch den Datentyp weiterer Argumente nicht immer prüfen, bei Funktionen mit unbestimmter Zahl von Argumenten sind für die optionalen Argumente nämlich auch keine bestimmten Datentypen durch C festgelegt. Im Falle der Funktion "printf" kann der Compiler im allgemeinen auch nicht prüfen, ob die Datentypen der angegebenen weiteren Argumente zu den Formatspezifizierer passen.
Die Verwendung von Funktionen mit variabler Zahl von Argumenten kann also Fehler enthalten, die schwieriger zu finden sind als bei Funktionen mit fester Zahl von Argumenten, die jeweils einen bestimmten Datentyp haben.
Daher sind Funktionen mit variabler Zahl von Argumenten mit besonderer Vorsicht zu verwenden.
In der Synopsis einer Funktionen mit variabler Anzahl von Argumenten wird die Stelle, ab der die Argumente, deren Anzahl noch nicht festgelegt ist, vorkommen können, durch drei direkt aufeinanderfolgende Punkte "..." gekennzeichnet. (Die Synopsis der Funktion "printf" verwendet außerdem die Parameterdeklaration "const char * restrict format" um festzulegen, daß ein Text als erstes Argument erwartet wird. Die Details dieser Parameterdeklaration sollen hier noch nicht behandelt werden.)
printf [Synopsis]
#include <stdio.h>
int printf( const char * restrict format, ... );