将 std::wstring 移植到 gcc cygwin

Posted

技术标签:

【中文标题】将 std::wstring 移植到 gcc cygwin【英文标题】:porting std::wstring to gcc cygwin 【发布时间】:2015-01-28 18:42:19 【问题描述】:

我正在尝试将用 Visual Studio 2010 编写的项目从 Microsoft 编译器移植到 gcc Cygwin。我的问题是 gcc Cygwin 或 gcc 是否支持 std::wstring ?有解决办法吗?

【问题讨论】:

std::wstring 是标准的一部分,如果我没记错的话。我不明白为什么 cygwind 不支持它。你测试过吗? @cassiorenan:但是,它在 Cygwin 中的工作方式与在 Visual Studio 中的工作方式完全不同。最容易假设它们是不相关的类。 啊,我明白了。那就无视我的回答。我对 Visual Studio 的特殊性不是很熟悉。 【参考方案1】:

是的。它支持,但并不容易。

要支持 wstring,你的平台需要支持一大堆 wchar_t 功能。 q.v.标准 C++ iostreams 和语言环境 Langer 和 Kreft。

仅仅说“嘿,我们有 wchar_t 和 wchar_t 字符特征,所以我们可以打开 std::wstring。” 该平台还 需要提供对 C++ 宽字符 I/O 的支持:wistream, wostream,方面,cvt,语言环境。这就是事情变成的地方 有问题。

对于 Windows 上的 Cygwin,平台是 Cygwin(而且它非常酷 POSIX API 层)比 WinAPI 更多。

旁白:我不确定 MinGW 的情况如何,但由于 MinGW 使用 直接使用 WinAPI 而不是使用更像 Unix 的 POSIX API 作为 方法,MinGW 可能不在这种 Cygwin 的情况下。

Windows 确实支持该功能,但是似乎没有人 已经经历了相当大的努力来安装 Cygwin 以使用 那些设施。 (那些是 FooW 例程,而不是 FooA 例程,在 WinAPI 中。并且有很多工作来获得语言环境 魔法正常工作。)

此外,Windows 使用 2 个字节的 wchar_t。 (以前的 UCS-2,来自 统一码 1.0时代。现在使用 Vista 和 Win7,它是 UTF-16。)让 Cygwin 使用 2 字节 wchar_t 而不是 4 字节会有点复古 wchar_t。这只会让一切变得更加困难。

欲知详情,请转至gcc.gnu.org/ml/gcc-help

【讨论】:

【参考方案2】:

它确实有支持。此代码在 g++ 4.8 上编译得很好(在任何符合标准的编译器上都应该如此):

#include <iostream>
#include <string>

int main()
  std::wstring s(L"Hello World!");
  std::wcout << s;

【讨论】:

以上是关于将 std::wstring 移植到 gcc cygwin的主要内容,如果未能解决你的问题,请参考以下文章

如何可移植地将 std::wstring 写入文件?

将 std::wstring 的内容从 C++ 返回到 C#

BSTR 到 std::string (std::wstring) 反之亦然

如何将 std::wstring 转换为 const TCHAR*?

如何使用 PInvoke 将 std::wstring 从 C++ 返回到 C# 而无需编写字符串缓冲区转换 [重复]

将 std::wstring 转换为 WCHAR*