【问题标题】:Porting Program From Linux to Windows: Using cstr将程序从 Linux 移植到 Windows:使用 cstr
【发布时间】:2017-07-31 23:42:14
【问题描述】:

我正在尝试将程序从 Linux 移植到 Windows 10。我有源代码,并且有对“cstr”类型的引用,如下所示:

cstr filename = sourceline->sourcefile;

我不认为 Windows SDK 定义了这种类型(在代码中它被标记为未定义)。我可以将其替换为标准 C++ 字符串定义,例如:

std::string filename;

或者 cstr 是否还有其他我不知道的属性?

【问题讨论】:

  • 你为什么不先在原始平台上查找cstr 实际上是? (不是标准类型)
  • 你能确定cstr的定义是从哪里来的吗?
  • 我实际上一直找不到它:它没有在 gcc 库参考中列出,当我用谷歌搜索时,我得到了关于 c_str 和 CStr 的讨论,它们不是一回事。我希望这里有人知道它来自哪里。
  • 请提供您要移植的程序的参考或链接。
  • 这是代码的链接:您可以在顶部附近看到“cstr”,在所有 cmets 和包含之后:pastebin.com/5GhUwBMB

标签: c++ linux string windows-10 porting


【解决方案1】:

我不知道您的cstr 类型的详细信息。但是,当您将代码移植到 Windows 时,您应该注意文件名字符串,尤其是它们的编码

在 Linux 上使用 UTF-8 很常见;但在 Windows 上,Win32 API 中使用的 "native" Unicode 编码是 UTF-16。因此,如果您使用std::string 在您的 Linux C++ 代码中存储 UTF-8 编码的字符串,您应该记得在 Windows 上将这些字符串从 UTF-8 转换为 UTF-16,然后再将它们传递给 Win32 API。

您可以在特定于 Windows 的 C++ 代码中使用 std::wstring 类(甚至是 ATL 中的 CStringW 类;您已经在此处编写特定于平台的代码,因此在 Windows 中使用非标准的不可移植类- 代码的特定部分应该不是问题)。

跨平台 C++ 代码的常见模式是在可移植的跨平台代码部分使用 UTF-8,并在 Windows API 边界转换为 UTF-16。

此外,您可能会发现感兴趣的this MSDN Magazine article "Unicode Encoding Conversions with STL Strings and Win32 APIs"

【讨论】: