libstdc++ und L10n unter FreeBSD

13/04/2008 - 19:57 von Sashi Asokarajan | Report spam
Halo zusammen,

hat jemand Erfahrungen mit der C++ std::locale Klasse unter FreeBSD(Net-/OpenBSD)
gemacht ? Wenn LANG=de_DE.UTF-8 (via login.conf) gesetzt ist, bricht das Programm
mit einer Exception ab.

Beispiel Code (mit "CC filename.cc" erzeugen):
#include <locale>
#include <iostream>
#include <clocale>

int main()
{
using std::cout;
using std::endl;

// C L10n
const char* const lstr = std::setlocale(LC_ALL, "");
cout << "C setlocale()result=";
cout << ( lstr ? lstr : "0" ) << "" << endl;

// C++ L10n
cout << "C++ std::locale" << endl;
std::locale loc("");
cout << "std::locale loc=" << loc.name() << endl;
}

Ausgabe:
C setlocale()
result=de_DE.UTF-8

C++ std::locale
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Abort (core dumped)

Wie man sieht, klappt es mit der C routine setlocale(). Wogegen die C++ Variante
mit einer Exception abbricht.

Habt Ihr eine Idee warum es so ist?


Sashi Asokarajan
 

Lesen sie die antworten

#1 Thomas Gellekum
13/04/2008 - 20:55 | Warnen spam
Sashi Asokarajan writes:

Halo zusammen,

hat jemand Erfahrungen mit der C++ std::locale Klasse unter FreeBSD(Net-/OpenBSD)
gemacht ? Wenn LANG=de_DE.UTF-8 (via login.conf) gesetzt ist, bricht das Programm
mit einer Exception ab.

Beispiel Code (mit "CC filename.cc" erzeugen):


[...]
std::locale loc("");



std::locale loc("C");

funktioniert, ist aber natürlich nicht, was man haben will. Jede
andere Locale führt zu einem runtime_error. Die libstd++ versucht
nicht mal, irgendwelche Dateien in /usr/share/locale zu öffnen. Für
mich sieht das so aus, als fehlte einfach der entsprechende Support,
jedenfalls in meinem àlteren FreeBSD-7-current.

In den Quellen von libstd++
(/usr/src/contrib/libstdc++/config/locale/generic/c_locale.cc) findet
sich dann:

void
locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s,
__c_locale)
{
// Currently, the generic model only supports the "C" locale.
// See http://gcc.gnu.org/ml/libstdc++/200...00345.html
__cloc = NULL;
if (strcmp(__s, "C"))
__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
"name not valid"));
}

und auch die Spezialisierung in .../config/locale/gnu/c_locale.cc gibt
nicht mehr her.

Der langen Rede kurzer Sinn: eine andere Locale als "C" ist mit
gcc-3.4.6 offenbar nicht unterstützt.

HTH,

tg

Ähnliche fragen