wchar_t
-
Hier mal meinen Codeausschnitt:
void printFont(const char* str, ...) { if(!str) return; float lenght = 0.0f; char text[512]; va_list ap; va_start(ap, str); vsprintf(text, str, ap); va_end(ap); ... }vsprintf(text, str, ap); wird als veraltet deklariert. Welche Methoden müsste ich nehmen?(sie sollten dann auch für wchar_t sein)
-
Für wchar_t gibt es die Funktion vswprintf.
Was das mit dem "veraltet deklariert" betrifft, ist eine etwas eigenartige Geschichte.
Der aktuelle C++ Standard wurde ja 1998 verabschiedet. Und damals sah der Funktionsprototyp von vsprintf in C wie folgt aus:int vsprintf(char * s, const char * format, va_list arg);Und genau diese Funktion referenziert C++ aufgrund der Kompatibilität zu C. Nun gab es aber ein Jahr später, also 1999, einen neuen C Standard. Und dort sieht die Funktion etwas anders aus:
int vswprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, va_list arg);Man hat einen weiteren Parameter für die Länge des zu beschreibenden Zeichenarrays eingeführt, damit Buffer-Overflows vermieden werden. Also gibt es seit dieser Zeit hier eine gewisse Inkompatibilität, obwohl man ja eigentlich genau das Gegenteil erreichen wollte. 2003 gab es dann eine Überarbeitung des C++ Standards. Nur geht daraus imo nicht eindeutig hervor, welche Signatur denn nun in C++ gültig ist. Dementsprechend unentschlossen werden wohl die Implementierer der Standardbibliothek die Sache handeln. Da anzunehmen ist, dass der aktuelle C++ Standard auch die aktuellen C Funktionen referenziert, werden die meisten C++ Standardbibliotheken vermutlich beide Versionen anbieten, bei der "alten" aber eine entsprechende Warnung bringen.
-
Vielen dank, habe ich mal wieder was neues gelernt.