6

据我了解, size_t 和 wchar_t 的表示完全是特定于平台/编译器的。例如,我读过 Linux 上的 wchar_t 现在通常是 32 位,但在 Windows 上是 16 位。有什么方法可以在我自己的代码中将它们标准化为设定的大小(int、long 等),同时仍然保持与两个平台上现有标准 C 库和函数的向后可比性?

我的目标本质上是对它们进行 typedef 之类的操作,因此它们是固定大小的。在不破坏某些东西的情况下这可能吗?我应该这样做吗?有没有更好的办法?

更新:我想这样做的原因是我的字符串编码在 Windows 和 Linux 上都是一致的

谢谢!

4

5 回答 5

6

听起来您正在寻找 C99 和 C++0x 的<stdint.h>/<cstdint>标头。这定义了uint8_t, 和等类型int64_t

cstdint.hpp如果您没有这些标题,则可以使用 Boost 。

于 2010-10-06T21:36:04.443 回答
5

您不想重新定义这些类型。相反,您可以使用类型定义,如int32_tor int16_t(有符号 32 位和 16 位),它们是<stdint.h>C 标准库的一部分。

如果您使用 C++,C++0x 将添加char16_tand char32_t,它们是用于 UTF-16 和 UTF-32 的新类型(不仅仅是整数类型的 typedef)。

对于wchar_t,另一种方法是只使用像ICU这样的库,它以独立于平台的方式实现 Unicode。然后,您可以只使用UChar类型,它始终是 UTF-16;您仍然需要注意字节顺序。ICU 还提供与 UChar (UTF-16) 之间的转换器。

于 2010-10-06T21:35:22.857 回答
2

不。尝试使用 typedef 来“修复”字符类型的根本问题是,您最终得到的东西在某些平台上与内置函数和宽字符文字一致,而在其他平台上则不然。

如果你想要一个在所有平台上都相同的字符串格式,你可以选择一个大小和签名。您想要无符号的 8 位“字符”,还是有符号的 64 位“字符”?您可以在任何具有适当大小的整数类型的平台上使用它们(并非所有平台都可以)。但是,就语言而言,它们并不是真正的字符,所以不要指望能够调用strlenwcslen对它们进行调用,或者对文字有很好的语法。字符串文字是(嗯,转换为) a char*,而不是 asigned char*或 an unsigned char*。宽字符串文字是 a wchar_t*,它等同于其他一些整数类型,但不一定是您想要的那种。

因此,您必须选择一种编码,在内部使用它,定义您自己需要的字符串函数版本,实现它们,然后根据需要转换为/从平台的编码转换为接受字符串的非字符串函数。utf-8 是一个不错的选择,因为大多数 C 字符串函数仍然“工作”,即使它们不完全正确,它们也会做一些相当有用的事情。

于 2010-10-06T22:15:11.747 回答
0

wchar_t 可能会比 size_t 更粘。可以假设 size_t 的最大大小(例如 8 个字节)并在写入文件(或套接字)之前将所有变量转换为该大小。要记住的另一件事是,如果您尝试写入/读取某种二进制表示,您将遇到字节顺序问题。无论如何, wchar_t 可能代表一个系统上的 utf-32 编码(我相信 Linux 会这样做)并且可以代表另一个系统上的 UTF-16 编码(Windows 会这样做)。如果您尝试在平台之间创建标准格式,则必须解决所有这些问题。

于 2010-10-06T21:44:54.093 回答
0

只需在内部使用 UTF-8,并在将参数传递给需要它的 Windows 函数时及时转换为 UTF-16。可能永远不需要 UTF-32。由于处理单个字符而不是字符串通常是错误的(在 Unicode 意义上),因此使用大写或规范化 UTF-8 字符串并不比处理 UTF-32 字符串更困难。

于 2010-10-06T21:47:27.480 回答