_configthreadlocale и localeconv - PullRequest
       38

_configthreadlocale и localeconv

2 голосов
/ 09 ноября 2008

Как мы все знаем, глобальные данные, такие как настройки локали, влияющие на использование десятичной запятой чисел printf () и strtod (), являются злом. К счастью, MSVC ++ 9 позволяет использовать локализацию для каждого потока при вызове _configthreadlocale(_ENABLE_PER_THREAD_LOCALE). К сожалению, похоже, что функция localeconv () этого не замечает и все еще возвращает глобальные настройки локали, например, Кажется, что localeconv () -> decimal_point всегда возвращает глобальную настройку локали до вызова _configthreadlocale (). Это ошибка в библиотеке MSVC или ожидается?

ТИА Пааво

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Несмотря на предположение, что это ожидаемое поведение от rubenvb, на самом деле это ошибка, с которой я столкнулся некоторое время назад. Я подозреваю, что rubenvb неправильно прочитал эту часть вопроса:

К сожалению, похоже, что функция localeconv () этого не замечает и по-прежнему возвращает глобальные настройки локали, например, localeconv () -> decimal_point, кажется, всегда возвращает глобальную настройку локали до вызова _configthreadlocale ().

Вопрос не предполагал, что localeconv () будет возвращаться для каждого потока перед вызовом _configthreadlocale (), так как это нарушит временной континуум. Вопрос заключался в том, что результаты вызова localeconv () после вызова _configthreadlocale () совпадают с предварительным вызовом, что является неожиданным. По сути это означает, что реализация Microsoft потоков C ++ STL в корне нарушается при использовании _configthreadlocale ().

0 голосов
/ 22 сентября 2011

Вызов _configthreadlocale устанавливает свойство, перед вызовом ничего особенного не происходит. Так что да, это ожидаемое поведение. Сначала вы должны вызвать эту функцию, а затем вы можете воспользоваться локальными настройками потока.

...