C++ solaris(x86)上关于std::basic_字符串的一些难题
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(); ++
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;
}