在visual studio和eclipse中打印wchar_t会产生不同的结果

时间:2013-05-20 06:54:29

标签: c++ visual-studio pointers cross-platform

我在windows x64上使用eclipse和Visual Studio。当我通过将指针递增1在visual studio中打印以下字符串时,它在visual studio中显示正确的结果。但是在eclipse中,指针被提前4而不是1.为什么会出现这种差异?如何在eclipse中使指针前进1?

INPUT STRING

[{ “比例因子”:4, “球”:{ “半径”:0.03999999910593033}}]

CODE

unsigned char* temp = fileUtils->getFileData("levels.json", "r", &size);
wchar_t *levelData  = new wchar_t[size];
size_t len_or_error = 0;
if(size > 0) {
    const char* temp1 = reinterpret_cast<const char*>(temp);
    len_or_error = mbstowcs(&levelData[0], &temp1[0], size);
}
for(int i = 0; i < 100; i++) {
    CCLOG("i = %d | %s ", i, levelData + i);
}

OUTPUT VS 12

i = 0 | [
i = 1 | { 
i = 2 | " 
i = 3 | s 
i = 4 | c 
i = 5 | a 
i = 6 | l 

OUTPUT ECLIPSE

i = 0 | [{"scaleFactor":4,"ball":{"radius":0.03999999910593033}}]
i = 1 | caleFactor":4,"ball":{"radius":0.03999999910593033}}]
i = 2 | Factor":4,"ball":{"radius":0.03999999910593033}}]
i = 3 | or":4,"ball":{"radius":0.03999999910593033}}]
i = 4 | 4,"ball":{"radius":0.03999999910593033}}]

更新 忘了提到我在Android设备上运行eclipse版本而不是在Windows本身上运行。

UPDATE2

在打印wchar_t之前添加了额外的代码。

CCLOG是cocos2d-x https://github.com/cocos2d/cocos2d-x

的默认记录器

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,与其他编译器(如GCC)相比,wchar_t与VC ++编译器的大小不同。

Windows使用two bytes to represent wchar_t。您的代码似乎在Visual Studio中正常工作,因为您告诉格式字符串说明符读取一个窄字符串(一个字节)。您应该使用%s来正确读取宽字符串,而不是%ls。但是,我认为你真正想做的是读一个字符。为此,请尝试:

printf("i = %d | %lc\r\n ", i, *( levelData + i ) );

您没有指定使用Eclipse的编译器,但GCC(我认为MinGW)最多使用4个字节来存储wchar_t,这就是它跳过4个字节的原因。请参阅How big is wchar_t with GCC?看起来它也使用可变长度编码来存储数据。