snprintf auf _snprintf Funktion mappen
-
Hallo!
Ich habe ein Problem mit der snprintf Funktion von Windows.
Mein Code soll mit zwei Compilern erfolgreich compiliert werden können.
Leider bietet der VS Compiler nicht die Funktion "snprintf" sondern seine eigene Funktion "_snprintf" an.
Nun wollte ich mir eine Funktion snprintf selbst definieren die grob folgendes macht:
int snprintf( .... ) { return _snprintf( ....); }
Definiert sind die Funktionen folgendermaßen:
/* Tasking: */ extern int snprintf ( char * restrict, size_t, const char * restrict, ... ) __format__(printf,3,4); /* MSVC6: */ _CRTIMP int __cdecl _snprintf(char *, size_t, const char *, ...);
Mein Problem liegt allerdings in der variablen Argumenten-Liste. Hier weiß ich leider nicht, wie ich das ummappen soll.
Meine eigene Funktion snprintf kommt dann anschließend in ein .c/.h File, das nur bei Windows mitcompiliert wird.
Hat jemand eine Idee wie ich dieses Mapping umsetzen könnte?
Danke euch!
Gruß,
Flasher
-
Für variable Argumente gibt es die Funktionen/Makros va_start, va_end, etc.
Tatsächlich wäre es in deinem Fall aber einfacher folgendes zu machen:
#ifdef WIN32 // Whatever... #define snprintf _snprintf #endif
-
Eine Möglichkeit wäre es, dir dir va_list-Version zu verwenden (wenn es eine gibt, die printf()-Funktionen aus dem Standard haben alle eine). Ansonsten könnte noch der Präprozessor helfen:
#ifdef _WIN32 // bzw. eine andere "ich bin der MSVC"-Kennung #define snprintf _snprintf #endif
-
Vorsicht: _snprintf verhält sich subtil anders als snprintf. Wenn der übergebene Speicher nicht ausreicht, gibt _snprintf -1 zurück, während snprintf die Länge des Strings zurückgibt, der geschrieben worden wäre, wenn genug Platz vorhanden gewesen wäre.
Ansonsten definiert MSVC das Makro _MSC_VER:
#ifdef _MSC_VER /* MSVC-spezifischer Code */ #endif
Man kann damit auch auf verschiedene Versionen von MSVC testen:
#if defined(_MSC_VER) && _MSC_VER >= 1500 /* MSVC 2008 oder später */ #endif
-
Danke euch!
Manchmal ist die Lösung einfacher als man denkt
Vor lauter variabler Argumentenliste habe ich den Präprozessor ganz vergessen