据我所知,size_t和wchar_t的表示完全是特定于平台/编译器的。例如,我已经读过Linux上的wchar_t现在通常是32位,但在Windows上它是16位。有没有什么方法可以在我自己的代码中将这些标准化为一个集合大小(int,long等),同时仍然保持与两个平台上现有标准C库和函数的向后可比性?
我的目标主要是做类似的设置,因此它们是一组尺寸。这可能不会破坏某些东西吗?我应该这样做吗?还有更好的方法吗?
更新:我之所以这样做,是因为我的字符串编码在Windows和Linux上都是一致的
谢谢!
答案 0 :(得分:6)
听起来你正在寻找C99&amp; C ++ 0x的<stdint.h>
/ <cstdint>
标头。这定义了uint8_t
和int64_t
等类型。
如果您没有这些标题,可以使用Boost的cstdint.hpp
。
答案 1 :(得分:5)
您不想重新定义这些类型。相反,您可以使用int32_t
或int16_t
(带符号的32位和16位)等typedef,它们是C标准库中<stdint.h>
的一部分。
如果你正在使用C ++,C ++ 0x将添加char16_t
和char32_t
,它们是用于UTF-16和UTF-32的新类型(不仅仅是用于整数类型的typedef)。
对于wchar_t
,另一种方法是使用像ICU这样的库,它以独立于平台的方式实现Unicode。然后,您可以使用UChar
类型,它始终为UTF-16;你仍然需要注意字节序。 ICU还向UChar(UTF-16)提供converters。
答案 2 :(得分:2)
没有。尝试使用typedef来“修复”字符类型的一个基本问题是,你最终得到的东西在某些平台上与内置函数一致并且具有宽字符文字,而在其他平台上则没有。
如果你想要一个在所有平台上都相同的字符串格式,你可以选择一个大小和签名。你想要无符号8位“字符”,或签名64位“字符”?您可以在任何具有适当大小的整数类型的平台上(不是全部都可以)使用它们。但是,就语言而言,它们并不是真正的字符,所以不要期望能够在它们上面调用strlen
或wcslen
,或者为文字提供一个很好的语法。字符串文字是(嗯,转换为)char*
,而不是signed char*
或unsigned char*
。宽字符串文字是wchar_t*
,相当于某些其他整数类型,但不一定是你想要的那个。
因此,你必须选择一个编码,在内部使用它,定义你需要的字符串函数的自己的版本,实现它们,然后根据需要转换为平台的编码,从而转换为带有字符串的非字符串函数。 utf-8是一个不错的选择,因为大多数C字符串函数仍然“有效”,因为它们做了一些相当有用的东西,即使它不完全正确。
答案 3 :(得分:0)
wchar_t可能比size_t更具弹性。可以假设size_t的最大大小(比如说8个字节)并在写入文件(或套接字)之前将所有变量强制转换为该变量。另外要记住的一件事是,如果您尝试编写/读取某种二进制表示,则会出现字节排序问题。无论如何,wchar_t可能代表一个系统上的utf-32编码(我相信Linux会这样做)并且可能代表另一个系统上的UTF-16编码(Windows会这样做)。如果您尝试在平台之间创建标准格式,则必须解决所有这些问题。
答案 4 :(得分:0)
在内部使用UTF-8,并在将参数传递给需要它的Windows函数时及时转换为UTF-16。可能永远不需要UTF-32。由于处理单个字符而不是字符串通常是错误的(在Unicode意义上),因此使用UTF-8字符串大写或规范化并不比使用UTF-32字符串更难。