0

这方面的文档相当缺乏,所以我希望社区可以在这里运行一个简单的测试并发布结果,以便我和其他任何人都有参考。

#include <cwchar>
sizeof( std::mbstate_t );

如果您可以在此处发布结果并提及您正在使用的编译器,我将不胜感激。

在 VS2010 上,它被声明为typedef int mbstate_t;32 位和 64 位版本的大小均为 4 字节。

我问这个是因为mbstate_tstreampos. 我需要使用这个成员来存储编码的转换状态。我可以逃脱的最小空间是 3 个字节,所以我需要知道是否有任何实现会破坏我的代码。

提前致谢。

4

3 回答 3

1

x86_64 上的 gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

size = 8

gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 on armv7l

size = 8
于 2013-07-24T06:41:50.470 回答
1

您只想知道sizeof的结果吗?

Debian 下带有 GCC x86 32 位的 Qt 5.1:

大小 = 8

于 2013-07-24T06:43:43.023 回答
0

从 C11 规范(7.29.1/2):

   mbstate_t

这是一个完整的对象类型,而不是数组类型,它可以保存在多字节字符序列和宽字符序列之间转换所需的转换状态信息;

因此,虽然我错了它可以是一个数组,但它可以是其他任何东西(包括一个包含数组的结构)。规范中的语言没有说明它应该如何实现,只是说它是“一个完整的对象类型而不是数组类型”。


来自 C++11 规范(多个地方,例如 21.2.3.1/4):

该类型在实现定义的支持的多字节字符编码规则集中mbstate_t定义<cwchar>并且可以表示可能出现的任何转换状态。


总之,如果您想要可移植,您不能依赖整数类型或特定大小。mbstate_t如果你想要可移植,你必须让标准库为你管理状态。

于 2013-07-24T07:08:18.783 回答