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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Name *

vier × fünf =