关于solaris(x86)上的std :: basic_string的一些难题
#include <iostream>
#include <string>
int main()
{
const wchar_t* s = L"abcdef";
std::wstring ws(s, s+6);
for(int i = 0; i < ws.size(); ++i)
{
std::cout << ws[i] << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行结果是:
97
99
101
0
0
0
Run Code Online (Sandbox Code Playgroud)
为什么不呢
97
98
99
100
101
102
Run Code Online (Sandbox Code Playgroud)
和代码
#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;
}
Run Code Online (Sandbox Code Playgroud)
可以得到预期的结果.我用gcc 3.4.6,build命令是g++ -fshort-wchar stringtest.cpp.任何人都可以给出一个表达?
-fshort-wchar读取文档,
-fshort-wchar覆盖基础类型
wchar_t是short unsigned int而不是默认的目标.此选项对于构建在WINE下运行的程序很有用.警告: -fshort-wchar开关导致GCC生成的代码与不使用该开关生成的代码不是二进制兼容的.使用它来符合非默认应用程序二进制接口.
所以看起来这个标志导致观察到的差异,并且由于语言规范没有讨论这样的标志,所以行为可以被分类为实现定义的或未定义的.
作为旁注,您应该使用wcout而不是cout处理宽字符时,因为wcout它设计用于处理宽字符:
cout是一个类型的对象 basic_ostream<char>.wcout是一个类型的对象 basic_ostream<wchar_t>.想想,在这种情况下,问题不是你用来打印值的问题,因为你告诉编译器无论如何都要将其wchar_t视为short unsigned int.
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |