char-array der Länge MB_CUR_MAX
-
Guten abend,
ich möchte einen wchar_t in einen UTF-8 string convertieren.
Dazu benutze ich die Funktion wctomb.
Die erwartet eine Buffer, der "large enough to hold a multibyte character, which at most is MB_CUR_MAX." ist.Also hacke ich folgendes:
char buf[MB_CUR_MAX]; wctomb(buf, w);
wobei w ein UCS-2 encodiertes Zeichen und vom Typ wchar_t ist.
Leider mag mein Compiler (llvm-gcc 4.2) das garnicht:
error: ISO C++ forbids variable-size array 'buf'MB_CUR_MAX ist in meiner stdlib.h definiert als
extern int __mb_cur_max;
Und nun? Ich kann natürlich da hartkodiert 4 reinschreiben, aber ist das die feine englische Art?
Gruß,
Philipp
-
Edit: Ehm.. du nutzt 1. einen C++ Compiler, aber zweitens ist MB_CUR_MAX ein Makro, bist du dir sicher, dass das so nicht funktioniert?
-
In meiner stdlib.h sieht's so aus:
#ifndef MB_CUR_MAX #ifdef _USE_EXTENDED_LOCALES_ #define MB_CUR_MAX (___mb_cur_max()) #ifndef MB_CUR_MAX_L #define MB_CUR_MAX_L(x) (___mb_cur_max_l(x)) #endif /* !MB_CUR_MAX_L */ #else /* !_USE_EXTENDED_LOCALES_ */ extern int __mb_cur_max; #define MB_CUR_MAX __mb_cur_max #endif /* _USE_EXTENDED_LOCALES_ */ #endif /* MB_CUR_MAX */
Das ist die stdlib von Darwin auf Mac OXS 10.7.
Philipp
-
Dein Compiler akzeptiert kein VLA, für ANSI C Arrays muss die Größe zur Compilerzeit bekannt sein und wird üblicherweise durch eine (symbolische) Konstante und nicht durch eine Variable (auch nicht const deklariert) wie in deinem Fall vorgegeben.
#define ARRAY_LAENGE 100 int array[ARRAY_LAENGE];
Für deinen Fall bleibt dir wohl nichts anderes übrig, als dynamisch Speicher zu reservieren.
char buf=malloc(MB_CUR_MAX); wctomb(buf, w); ... free(buf); /* !!! */
-
Na ganz großes Kino... Dynamisch Heapspeicher anlegen und freigeben in einer "heißen" Funktion. Dann doch lieber hartkodiert einen 4er-Buffer auf dem Stack.
Philipp
-
Beschwere dich beim Lieferanten deiner Bibliothek und jammere hier nicht rum.
Hätten sich die Leute an die gebräuchliche Namenskonvention mit Großbuchstaben für symbolische Konstanten gehalten, wären deine Probleme jetzt geringer.
Außerdem steht es dir ja frei weiter nachzugraben, wo denn __mb_cur_max letztendlich initialisiert wird, vielleicht ja mit einer richtigen symbolischen Konstanten, die du dann wiederverwenden kannst.