gpt4 book ai didi

c++ - 什么是 std::mbstate_t?

转载 作者:行者123 更新时间:2023-11-30 04:16:45 24 4
gpt4 key购买 nike

我正在通过从 std::codecvt 派生来创建自定义语言环境。除了这个 std::mbstate_t 之外,我应该实现的大多数方法都非常简单。在我的编译器 vs2010 上,它被声明为 int。但是,谷歌告诉我它是一个 POD 类型,它有时是一个 union (我不知道的)或一个结构(我再次找不到它)。

据我了解,std::mbstate_t 是部分转换的占位符。而且,我认为,当 std::codecvt::on_out() 需要更多空间来写入输出时,它会发挥作用,而输出又会调用 std::codecvt::do_unshift( )。如果我的假设有误,请纠正我。

我读过 another post关于存储指针,尽管该帖子没有足够的答案。我也读过 this example它假定它是 32 位类型,尽管标准规定 int 不少于 16 位。

我的问题。我可以在 std::mbstate_t 中安全地存储什么?我可以安全地用另一种类型替换它吗?上面帖子的答案建议替换它,但下面的评论另有说明。

最佳答案

我认为关于这些东西的/the/书是 Langer 和 Kreft 的 C++ IOStreams and Locales,如果你真的想弄乱这些东西,试着弄一本。现在,回到您的问题,mbstate_t 用于保存转换的状态。通常,您会将其存储在转换方面,但由于这些方面是不可变的,因此您需要将其存储在外部。实际上,当您需要多个字节序列来确定相应的字符时,就会使用它,mbsinit() 的 Linux 联机帮助页提供了 ISO-2022 和 UTF-7 作为此类编码的示例。请注意,这不会影响 UTF-8,其中单个 Unicode 代码点始终由字节序列编码,并且在影响结果之前或之后没有任何内容。部分 UTF-8 序列也不由它处理,do_in() 返回 partial

现在,您可以在 mbstate_t 中存储什么?由于实际类型是未定义的,而且操作它的函数数量非常有限,所以一开始您无能为力。但是,也没有其他任何东西对该状态做任何事情,因此您可以对其进行一些丑陋的黑客攻击。这可能需要一些 #ifdef ,具体取决于标准库,但是您可以简单地(ab)使用它是 POD(整数和 union 也是 POD)这一事实来存储几乎任何类型的 POD那不是更大。这不会为您赢得美丽的价格,并且代码不会自动在任何系统上运行,但我认为在这种情况下这是不可避免的,并且移植工作也很有限。

最后,能换吗?此类型是 std::char_traits 的一部分,它反过来会影响所有字符串和流,因此您需要在整个程序中替换它们或进行转换。此外,如果您现在创建一个新的 char_traits 类,您仍然无法轻松实例化,例如basic_string 与它,因为不能保证通用的 basic_string 模板甚至存在,只需要 charwchar_t 的两个特化(还有一些用于 C++11)存在。流的同上。简而言之,不,你不能替换 mbstate_t。

关于c++ - 什么是 std::mbstate_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17539809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com