C++ 使尺寸和尺寸便于携带?

C++ 使尺寸和尺寸便于携带?,c++,c,size-t,C++,C,Size T,据我所知,size\u t和wchar\u t的表示完全是特定于平台/编译器的。例如,我读到Linux上的wchar\u t现在通常是32位,但在Windows上是16位。有没有办法在我自己的代码中将它们标准化为一个设定的大小(int、long等),同时仍然保持与两个平台上现有的标准C库和函数的向后可比性 我的目标基本上是做一些像typedef这样的事情,使它们成为一个固定的大小。这是否可能不破坏某些东西?我应该这样做吗?有更好的办法吗 更新:我之所以要这样做,是因为我的字符串编码在Window

据我所知,size\u t和wchar\u t的表示完全是特定于平台/编译器的。例如,我读到Linux上的wchar\u t现在通常是32位,但在Windows上是16位。有没有办法在我自己的代码中将它们标准化为一个设定的大小(int、long等),同时仍然保持与两个平台上现有的标准C库和函数的向后可比性

我的目标基本上是做一些像typedef这样的事情,使它们成为一个固定的大小。这是否可能不破坏某些东西?我应该这样做吗?有更好的办法吗

更新:我之所以要这样做,是因为我的字符串编码在Windows和Linux上都是一致的


谢谢

您不想重新定义这些类型。相反,您可以使用typedef,如
int32\u t
int16\u t
(带符号的32位和16位),它们是C标准库中
的一部分

如果使用C++,C++ 0x将添加<代码> CHAR16.T<<代码>和<代码> CHAR32→T/<代码>,这是UTF16和UTF 32的新类型(不只是整数类型的Type)。


对于
wchar\u t
,另一种选择是只使用类似的库,它以独立于平台的方式实现Unicode。然后,您可以只使用
UChar
类型,它将始终是UTF-16;你仍然需要小心endianness。ICU还提供往返UChar(UTF-16)的服务

听起来像是在寻找C99的&C++0x的
/
头。这定义了诸如
uint8\u t
int64\u t
之类的类型


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

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

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

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

如果您想要在所有平台上都相同的字符串格式,您可以选择一个大小和符号。您想要无符号8位“字符”还是有符号64位“字符”?您可以在任何具有适当大小的整数类型的平台上使用它们(并非所有平台都有)。但是,就语言而言,它们并不是真正的字符,所以不要期望能够调用
strlen
wcslen
,也不要期望它们具有良好的文字语法。字符串文字是(很好地,转换成)一个
char*
,而不是
有符号char*
无符号char*
。宽字符串文本是一个
wchar\u t*
,它等同于其他一些整数类型,但不一定是您想要的类型


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

谈论一个矛盾的术语:“将它们标准化为一个设定的大小(int、long等)让它们与使用Sisixt和W查尔夫直接一样变大。在<代码> WCARGYT 之间,有一个巨大的不同,就是C和C++。你需要决定你要用哪种语言。为了我的目的标准化。我想知道我在两个平台上运行的代码使用的是相同大小的项目。其中一个要点是,您不需要关心它们的表示或特定于平台的大小。为什么你需要它们的大小与你的代码相同?我想避免Windows的UTF-16与Linux的UTF-32之间的麻烦如果我创建一个int32字符串,它是否仍然适用于所有基于wchar的函数/方法?我想知道,在所有平台上,我的编码都是UTF-32(例如)@Tyler,不是。你必须确保传递给需要
wchar\t
字符串的函数的任何内容都可以安全地转换为它。例如,将指向int32_t的指针传递给Windows wchar_t函数将失败。在ICU中,您可以使用u_strToWCS()和u_strFromWCS()在UChar和平台的Unicode wchar_t之间进行转换(假设wchar_t是Unicode)。然后在所有地方使用UChar*作为字符串。ICU提供了大量使用UChar*字符串的函数。