Immer wieder finde ich zu Funktionen mit variablen Argumenten folgende Konstruktion:
1 2 3 4 5 6 7 8 9 | #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):
1 2 3 4 5 6 7 8 | 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.