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.