Immer wieder finde ich zu Funktionen mit variablen Argumenten folgende Konstruktion:
#include <stdarg.h> extern void another_funktion(int id, char *fmt, va_list args); void function_with_variable_arguments(int id, char *fmt, ...) { va_list args = 0; if (fmt) va_start(args, fmt); another_funktion(id, fmt ? fmt : "", args); if (fmt) va_end(args); }
Hier stellt sich die Frage, warum für fmt unbedingt den Wert 0 erlaubt werden muss? Nach C99-Standard ist va_list ein opaques Objekt und kein Pointer. Weder das Vorinitialisieren der va_list (führt auf vielen Architekturen zu Compiler-Fehlern) noch das Prüfen von fmt auf NULL (Der Wert von fmt spielt für va_start() keine Rolle) ist sinnvoll und führt auf vielen Architekturen zu Fehlern. So geht es mit allen Compilern und Plattformen (auch wenn fmt == 0 ist):
extern void another_funktion(int id, char *fmt, va_list args); void function_with_variable_arguments(int id, char *fmt, ...) { va_list args; va_start(args, fmt); another_funktion(id, fmt, args); va_end(args); }
Also einfach va_start() ohne Bedingung aufrufen und gut.