0

これに関するドキュメントはかなり不足しているので、コミュニティが簡単なテストを実行し、結果をここに投稿して、私や他の誰かが参考になることを願っています.

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

ここに結果を投稿し、使用しているコンパイラについても言及していただければ幸いです。

VS2010 では として宣言されtypedef int mbstate_t;、サイズは 32 ビットと 64 ビットの両方のビルドで 4 バイトです。

mbstate_tのメンバーなので質問していstreamposます。このメンバーを使用して、エンコーディングの変換状態を保存する必要があります。回避できる最小スペースは 3 バイトであるため、実装によってコードが壊れるかどうかを知る必要があります。

前もって感謝します。

4

3 に答える 3

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 に答える