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.


Anmelden zum Antworten