私が与えた以前の回答では、'\u0B95'
3バイトが必要であり、複数文字のリテラルであるという事実によって引き起こされる次の警告に応答しました。
warning: multi-character character constant [-Wmultichar]
しかし実際には、私は自分が正しいとは思いませんし、gccもそうではないと思います。標準は次のように述べています。
複数のc-charを含む通常の文字リテラルは、複数文字リテラルです。
c-charの生成規則の1つは、ユニバーサル文字名(つまり\uXXXX
、または\UXXXXXXXX
)です。\u0B95
は単一のc-charであるため、これは複数文字のリテラルではありません。しかし、今では厄介になります。規格には次のようにも書かれています。
単一のc-charを含む通常の文字リテラルのタイプは、実行文字セット内のc-char
char
のエンコードの数値に等しい値です。
したがって、私のリテラルには、実行文字セット内の文字のタイプchar
と値(または、そのセットに存在しない場合は実装定義の値)があります。char
基本文字セットのメンバーを格納するのに十分な大きさであると定義されているだけです(これは実際には標準で定義されていませんが、基本実行文字セットを意味すると思います)。
文字(char)として宣言されたオブジェクトは、実装の基本文字セットのメンバーを格納するのに十分な大きさでなければなりません。
したがって、実行文字セットはachar
が保持できるすべての値のスーパーセットであるため、私の文字はに収まらない可能性がありchar
ます。
では、私にはどのような価値がchar
ありますか?これはどこにも定義されていないようです。標準では、char16_t
リテラルの場合、値が表現できない場合、プログラムの形式が正しくないとされています。ただし、通常のリテラルについては何も述べていません。
どうしたの?これは標準の混乱ですか、それとも何かが足りませんか?