[英]C++ - global setlocale works, the same locale passed to _vsnprintf_l doesn't
我有以下C ++代码示例:
void SetVaArgs(const char* fmt, const va_list argList)
{
setlocale( LC_ALL, "C" );
// 1
m_FormatBufferLen = ::_vsnprintf(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt, argList);
setlocale( LC_ALL, "" );
//2
m_FormatBufferLen = ::_vsnprintf(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt, argList);
_locale_t locale = _create_locale(LC_ALL, "C");;
//3
m_FormatBufferLen = ::_vsnprintf_l(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt,locale, argList);
arglist包含具有扩展ascii字符的LPCTSTR。 命令// 1将其复制到缓冲区,如预期的那样。 命令// 2停止复制范围129-161中的第一个字符(那里很少有例外)。
我想在不更改进程的全局语言环境的情况下解决此问题,但是命令// 3的作用类似于// 2,为什么? 我正在传递“ C”语言环境,所以我期望从命令// 1生效。
默认情况下,我在英语Windows XP上使用波兰语区域设置。
事实证明,这是VS2005及更高版本(2008和2010)中的CRT错误。 在此处提交给Microsoft: https : //connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 523503#details
错误适用于_sprintf_l,_vsnprintf_l,_sprintf_s_l,_vsnprintf_s_l以及其他亲戚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.