LINUX.ORG.RU

MingW, C++ locale


0

0

Привет!

Использую MingW 5.1.4 (gcc 3.4.5-20060117) и наблюдаю большую проблему
с локалями. К примеру, даже нижеприведенный такой тестовый код падает с
исключением bad_cast, при попытке использовать use_facet. Этот же код,
откомпилированный под Linux 4-ым gcc, работает превосходно,
равно как и откомпилированный с помощью MS Visual C++ Toolkit 2003.

#include <string>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
  locale::global(locale(""));
  cout << "Current locale is: " << locale("").name() << endl;
  const ctype<wchar_t>& ct =
    use_facet<ctype<wchar_t> >(locale(""));
  return 0;
}

Кроме того, локали отличные от classic — не поддерживаются в этом
MingW, что создает мне большие проблемы :/

Вопросы:
1. Не появились ли в новой экспериментальной версии MingW поддержка
   локалей?
2. Не озаботился ли кто добавлением локалей в существующую
   стабильную версию MingW?
3. Имеет ли смысл попробовать STLPort в качестве замены MingW'шного
   STL, как там с локалями и вообще, в целом?
4. Если все безнадежно, натолкните на документ по
   разработке-добавлению собственных классов локалей.
anonymous

Re: MingW, C++ locale

The wide-character parts of the GCC Standard C++ Library (libstdc++) have not yet been fully ported to Windows, so you cannot use most of these features with MinGW. If you try to use things like std::wcout or basic_string<wchar_t> then you will probably get compiler or linker errors.

This has been discussed frequently on the mailing lists:

http://article.gmane.org/gmane.comp.gnu.mingw.user/10819

http://article.gmane.org/gmane.comp.gnu.mingw.user/13125

If you really need these features then one alternative is to use the STLPort library from http://www.stlport.org/ instead of libstdc++.

(c) MinGW Wiki

Так что варианта два: 1) Заюзать STLPort; 2) Заюзать другой компилятор со своей C++'ной библиотекой (например MSVC++).

mironov_ivan ★★★★★ ()
Ответ на: Re: MingW, C++ locale от mironov_ivan

Re: MingW, C++ locale

> Так что варианта два: 1) Заюзать STLPort; 2) Заюзать другой компилятор со своей C++'ной библиотекой (например MSVC++).

Попытался заюзать STLPort (5.4.1) на том-же примере кода. Результат:

$ ./a.exe test

Current locale is:

Т.е. locale(""), которое должно обозначать текущую системную локаль, не устанавливается, но и программа хотя-бы не падает. Более, того

$ LANG=ru_RU;export LANG

$ ./a.exe test

Current locale is:

Поддержка локалей что-то не ахти :(

Другой компилятор попробовать заюзать можно, наверное единственно приемлемый вариант, кроме того, как отказаться от юникода в win32-версии :)

anonymous ()

Re: MingW, C++ locale

Какбэ да, MinGW, а точнее её библиотеки -- это нечто феерическое. Помимо локалей не работют полностью ещё файловые потоки, и работа с буферами. Решаеться проблемма кроскомпиляций на оффтопик из родной gcc-шной среды. Там всё работает как часы.

З.Ы. -- пользуешься MinGW -- тесть всегда на чём-то ещё. Я о некорректное поведение стандартных библиотек лбом четверо суток как-то бился.

Remington ()

Re: MingW, C++ locale

Если кому интересно, то оказалось, что в экспериментальной версии MinGW (gcc.exe (GCC) 4.3.0 20080305 (alpha-testing) mingw-20080502) эта проблема решена.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.