Fragen? Antworten! Siehe auch: Alternativlos
Wozu braucht man das? Nehmen wir mal an, ich will ein free() schreiben, das mehr als ein Argument nimmt, und dann alle Argumente freigibt. Der normale Weg in C ist, dass man am Ende einen Sentinel übergibt, normalerweise NULL. Und dann macht man ein variadisches Makro drum herum, damit der Programmierer das nicht verpeilt. Beispiel:
#define mputs(f,…) _mputs(f,__VA_ARGS__,NULL)Das funktioniert, aber ist in-band signalling, und jeder gute Ingenieur weiss, dass man von in-band signalling besser die Finger lassen sollte. Ich will daher lieber am Anfang die Anzahl der folgenden Argumente übergeben, als am Ende ein NULL dranzuhängen. Bei free statt fputs kommt hinzu, dass NULL ein gültiger Wert ist, auf den man free aufrufen darf, und sich daher als Sentinel nicht eignet.void _mputs(FILE* f,…) {
va_list a;
const char* s;
va_start(a,f);
while ((s=va_arg(a,const char*)))
fputs(s,f);
va_end(a);}
Hier ist der Google News Thread mit der Lösung. Sie ist nicht schön und nicht elegant, aber sie funktioniert.