wchar_t と wint_t

wint_t wchar_t の任意の有効な値を格納できます . wint_t WEOF を評価した結果を受け取ることもできます マクロ (wchar_t 結果を保持するには狭すぎる可能性があります)。


@musiphil が彼のコメントをうまくまとめているので、ここで詳しく説明しますが、概念 wint_t の違い そして wchar_t .

それらの異なるサイズは、それぞれが非常に異なるセマンティクスを持っているという事実に由来する技術的な側面です。 :

    <リ>

    wchar_t 文字を保存するのに十分な大きさです 、またはコードポイント 必要に応じて。そのため、署名されていません . char に似ています。 、事実上すべてのプラットフォームで、8 ビットの 256 値に制限されていました。ワイド文字列 変数 当然、この型の配列またはポインタです。

    <リ>

    次に、文字列 関数 を入力します 、そのうちのいくつかは any を返すことができる必要があります wchar_t さらに追加のステータス .したがって、戻り値の型は must wchar_t より大きいこと .だから wint_t が使用され、任意のワイド文字と WEOF を表現できます .ステータスであるため、ネガティブになることもあります (通常はそうです)、したがって wint_t 署名されている可能性が高い .私が「可能性がある」と言ったのは、C 標準が強制していないからです。 それはある。ただし、兆候に関係なく、ステータス値は外側である必要があります wchar_t の範囲 .これらは戻り値としてのみ有用であり、格納することを意図したものではありません

「クラシック」との類推 char そして int 混乱を解消するのに最適です:文字列は int [] 型ではありません 、それらは char var[] です (または char *var )。 char のせいではない "int の半分のサイズです " 、しかしそれが文字列だからです .

あなたのコードは正しいようです:c getwch() の結果を確認するために使用されます wint_t です .その値が WEOF でない場合 、あなたの if として wchar_t に割り当てても安全です 文字 (または文字列配列、ポインタなど)


UTF-8 Unicode の可能なエンコーディングの 1 つです。 1 文字あたり 1、2、3、または 4 バイトを定義します。 getwc()まで読んだら 、1 ~ 4 バイトをフェッチし、それらから 1 つの Unicode 文字 codepoint を構成します wchar に収まる (プラットフォームによっては、16 ビット幅または 32 ビット幅になる場合もあります)。

しかし、Unicode 値は 0x0000 のすべての値にマップされるため、 0xFFFF へ 、条件コードまたはエラー コードを返す値が残っていません。すべて 利用可能な値のうち、EOF には何も残らない)

さまざまなエラー コードには、EOF (WEOF) が含まれます。 )、-1 にマップされます。 getwc() の戻り値を入れるとしたら wchar で 、Unicode 0xFFFF と区別する方法はありません 文字 (ところで、とにかく予約されていますが、余談です)。

答えはより広い タイプ、wint_t (または int )、少なくとも 32 ビットを保持します。これにより、実際の値の下位 16 ビットが得られ、ビットがその範囲外に設定されている場合は、文字が戻る以外の何かが発生したことを意味します。

いつも wchar を使わない理由 wint の代わりに ?ほとんどの文字列関連の関数は wchar を使用します ほとんどのプラットフォームでは、wint の ½ サイズだからです。 であるため、文字列のメモリ フットプリントは小さくなります。