如果在std :: wstring声明和std :: setlocale()之后调用,则mbrlen()无法返回

时间:2014-09-06 06:14:46

标签: c++

如果在std :: wstring声明和std :: setlocale()之后调用,则

mbrlen()无法返回。

示例:

#include <locale>
#include <wchar.h>

int main() {
    std::wstring TestString;
    std::setlocale(LC_ALL, "");
    mbstate_t mbs;
    size_t Res = mbrlen(NULL, 0, &mbs);    //Initialize mbs
    return 0;
}

编译:

g++ -I/usr/include -std=c++0x -L/usr/lib64 -L/usr/local/lib test.cpp

不返回,但是删除std :: wstring声明可以解决问题,所以返回正常:

#include <locale>
#include <wchar.h>

int main() {
    //std::wstring TestString;
    std::setlocale(LC_ALL, "");
    mbstate_t mbs;
    size_t Res = mbrlen(NULL, 0, &mbs);    //Initialize mbs
    return 0;
}

或者删除setlocale()(同时保留声明)也可以正常工作。

fedora 20,g ++ 4.8.3 20140624

1 个答案:

答案 0 :(得分:3)

在尝试使用之前,您应该将mbs归零。

#include <cstring>
memset(&mbs, 0, sizeof(mbs));

或初始化它(更像C ++):

mbstate_t mbs{};