C++ solaris(x86)上关于std::basic_字符串的一些难题

C++ solaris(x86)上关于std::basic_字符串的一些难题,c++,stl,solaris,C++,Stl,Solaris,solaris(x86)上关于std::basic_字符串的一些难题 为什么不是呢 97 98 99 100 101 102 代码呢 #include <iostream> #include <string> int main() { const wchar_t* s = L"abcdef"; std::wstring ws; ws.resize(6); for(int i = 0; i < ws.size(); ++

solaris(x86)上关于std::basic_字符串的一些难题

为什么不是呢

97
98
99
100
101
102
代码呢

#include <iostream>
#include <string>
int main()
{
    const wchar_t* s = L"abcdef";
    std::wstring ws;
    ws.resize(6);       
    for(int i = 0; i < ws.size(); ++i)
    {
        std::cout << (ws[i] = s[i]) << std::endl;
    }
    return 0;
}
#包括
#包括
int main()
{
常数wchar_t*s=L“abcdef”;
std::wstring-ws;
ws.resize(6);
对于(int i=0;i
-fshort-wchar

wchar\u t
的基础类型重写为
short unsigned int
,而不是目标的默认类型。此选项对于生成在WINE下运行的程序非常有用

警告:fshort wchar开关导致GCC生成的代码与未使用该开关生成的代码不兼容。使用它可符合非默认应用程序二进制接口

因此,这个标志似乎导致了观察到的差异,而且由于语言规范没有讨论这个标志,所以行为可以分为实现定义的或未定义的


作为旁注,处理宽字符时应使用
wcout
而不是
cout
,因为
wcout
设计用于处理宽字符:

  • cout
    是类型为
    basic\u ostream
    的对象
  • wcout
    是类型为
    basic\u ostream
    的对象

我想,在这种情况下,问题不在于您使用什么来打印值,因为您告诉编译器将
wchar\u t
视为
short unsigned int

标准库很可能不是使用
--short wchar
编译的。此标志会更改ABI,尽管由于名称manglin而未被检测到g没有改变。

问题似乎是
ws[i]
给出了错误的结果;当我查看原始内存时,字符串似乎包含了预期的数据。这是非常令人困惑的原因;据我所知,
操作符[]
只是取消对指向
wchar\u t
的指针的引用,该指针在其他地方正常工作(例如,在第二个示例中打印
s[i]
)。在较新版本的GCC(我尝试了4.6.1)和Linux上也会出现此问题


可以使用<代码>(WS.No.2)/<代码>来处理它。< /P>这很有意思。在Windows中,用Visual C++ 2010,您的第一个代码示例给出了第二个答案。此外,G+在没有代码> -FLASH WCHAR 时给出正确的结果。“-fshort wchar:将

wchar\u t
的基础类型重写为'short unsigned int',而不是目标的默认值。”了解sizeof(wchar\u t)和sizeof(short unsigned int)会很有用。”。。。
97
98
99
100
101
102
#include <iostream>
#include <string>
int main()
{
    const wchar_t* s = L"abcdef";
    std::wstring ws;
    ws.resize(6);       
    for(int i = 0; i < ws.size(); ++i)
    {
        std::cout << (ws[i] = s[i]) << std::endl;
    }
    return 0;
}