3

よく知られているように、グローバル データは、printf() と strtod() が使用している数値の小数点に影響を与えるロケール設定のような悪です。_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)さいわい、MSVC++ 9 では、呼び出しによってスレッドごとのロケールを使用できます。残念ながら、localeconv() 関数はこれに気付かず、依然としてグローバル ロケール設定を返すようです。たとえば、localeconv()->decimal_point は、_configthreadlocale() 呼び出しの前に常にグローバル ロケール設定を返すようです。これは MSVC ライブラリのバグですか、それとも予期されたものですか?

ティア・パーヴォ

4

2 に答える 2

2

これは rubenvb の予期された動作であるという提案にもかかわらず、実際には、これは少し前に遭遇したバグです。rubenvb が質問のこの部分を読み間違えたのではないかと思います。

残念ながら、localeconv() 関数はこれに気付かず、依然としてグローバル ロケール設定を返すようです。たとえば、localeconv()->decimal_point は、_configthreadlocale() 呼び出しの前に常にグローバル ロケール設定を返すようです。

質問は、_configthreadlocale() を呼び出す前にスレッドごとに localeconv() を返すことを意図していませんでした。質問は、_configthreadlocale() を呼び出した後に localeconv() を呼び出した結果が、事前に呼び出した場合と同じであることを示唆していましたが、これは予想外です。これは基本的に、_configthreadlocale() を使用すると、Microsoft の C++ STL ストリームの実装が根本的に壊れていることを意味します。

于 2011-10-10T01:29:27.087 に答える
0

への呼び出し_configthreadlocaleはプロパティを設定します。呼び出しの前に、特別なことは何も起こりません。はい、これは予想される動作です。最初にこの関数を呼び出す必要があります。その後、スレッド ローカル ロケールを利用できます。

于 2011-09-22T14:21:42.317 に答える