станд.:: поломка локали на MacOS 10.6 с LANG=en_US.UTF-8

Бесконечная рекурсия является распространенным способом получить ошибку переполнения стека. Для предотвращения - всегда удостоверяются, что существует путь выхода, который будет быть пораженным.:-)

Другой способ получить переполнение стека (в C/C++, по крайней мере) состоит в том, чтобы объявить некоторую огромную переменную на стеке.

char hugeArray[100000000];

Это сделает это.

16
задан Peter Hosey 17 November 2009 в 09:57
поделиться

4 ответа

Хорошо, у меня нет ответа для вас, но у меня есть несколько подсказок:

  • Это не ограничивается OS X 10.6. Я получил тот же результат на машине 10.4.
  • Я просмотрел исходный код GCC для libstdc ++ и искал _S_create_c_locale . То, что я нашел, находится в строке 143 файла config / locale / generic / c_locale.cc . В комментарии говорится: «В настоящее время универсальная модель поддерживает только локаль« C »». Это не многообещающе. Фактически, если я сделаю LANG = C , ошибка выполнения исчезнет, ​​но любое другое значение для LANG , которое я попробую, вызовет ту же ошибку, независимо от того, какие аргументы я передать конструктору locale . (Я пробовал locale :: classic () , «C», «» и значение по умолчанию). Это верно еще в GCC 4.0
  • На той же странице есть ссылка на обсуждение списка рассылки libstdc ++ по этой теме. Я не знаю, насколько это плодотворно: я только немного проследил за ним, и он очень быстро становится техническим.

Ничего из этого не говорит вам, почему локаль по умолчанию в 10.6 не будет работать с std :: locale , но он предлагает обходной путь, который должен установить LANG = C перед запуском программы.

9
ответ дан 30 November 2019 в 21:54
поделиться

Исключение _S_create_c_locale , по-видимому, указывает на некоторую неправильную конфигурацию: проверьте, установлена ​​ли ваша переменная среды LC_ALL или LANG to существует в выходных данных locale -a .

$ env LC_ALL=xx_YY ./test
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
Aborted
$ env LC_ALL=C ./test
$ echo $?
0

Но поскольку вы работаете в OS X, я не совсем уверен, как предполагается обрабатывать информацию о локали.

1
ответ дан 30 November 2019 в 21:54
поделиться

У меня была та же проблема, я проверил LANG и LC_MESSAGES, и они не устанавливаются, когда вы запускаете приложение через Finder, поэтому следующие строки спасли положение:

unset("LANG");
unset("LC_MESSAGES");
3
ответ дан 30 November 2019 в 21:54
поделиться

Ситуация все та же. Но некоторая функциональность может быть получена с помощью

setlocale( LC_ALL, "" );

. Это дает вам возможность кодирования UTF-8 в широком потоке iostream , но не форматирования денег для двух моих точек данных.

locale::global( locale( "" ) );

должен быть эквивалентен, но он дает сбой при последующем запуске в той же самой программе.

4
ответ дан 30 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: