2

UTF-8 の実行文字セットを持つ C++11 コンパイラを考えてみましょう (また、char型が符号付き 8 ビット バイトであることを要求する x86-64 ABI に準拠しています)。

文字 Ä (ウムラウト) の Unicode コード ポイントは0xC4で、2 コード単位の UTF-8 表現は{0xC3, 0x84}

コンパイラは、文字リテラルに の値を持つ'\xC4'の型を割り当てます。int0xC4

コンパイラは標準に準拠しており、ABI に準拠していますか? あなたの推論は何ですか?

C++11 標準からの関連する引用:

2.14.3.1

単一の c-char を含む通常の文字リテラルの型は char で、値は実行文字セットでの c-char のエンコーディングの数値に等しくなります。複数の c-char を含む通常の文字リテラルは、複数文字リテラルです。複数文字リテラルには、型 int と実装定義の値があります。

2.14.3.4

エスケープ \xhhh は、円記号の後に x が続き、その後に目的の文字の値を指定するために使用される 1 つ以上の 16 進数が続きます。文字リテラルの値が、char に対して定義された実装定義の範囲外にある場合、その値は実装定義です。

4

3 に答える 3

2

§2.14.3 パラグラフ 1 は、間違いなく (C++11) 標準の関連テキストです。ただし、元のテキストにはいくつかの欠陥があり、最新版には次のテキストが含まれており、強調が追加されています。

複数文字リテラル、または実行文字セットで表現できない単一の c-char を含む通常の文字リテラルは、条件付きでサポートされ、 int 型を持ち、実装定義の値を持ちます。

これは欠陥として認められていますが、実際には標準の一部ではありません。ただし、これは推奨事項であり、多くのコンパイラが実装すると思われます。

于 2013-02-25T00:48:58.397 に答える
1

2.1.14.3p4から:

文字リテラルの値は、に対して定義された実装定義の範囲外にある場合、実装定義です。char

x86コンパイラは歴史的に(そしてあなたが指摘するように、その慣行は今やある種の公式標準になっています)に署名しcharました。\xc7はその範囲外であるため、実装では、生成されるリテラル値を文書化する必要があります。

実装は、\ xエスケープで指定された範囲外のcharリテラルを(範囲内の)整数リテラルにプロモートしているようです。

于 2013-02-24T22:44:57.517 に答える
0

リンゴ、オレンジ、ナシ、キンカンを混ぜています :)

はい、「\xc4」は正当な文字リテラルです。具体的には、標準で「狭い文字リテラル」と呼ばれるもの。

C++ 標準から:

基本ソース文字セットのメンバーのグリフは、ASCII 文字セットに対応する ISO/IEC 10646 のサブセットから文字を識別することを目的としています。ただし、ソース ファイル文字からソース文字セットへのマッピング (変換フェーズ 1 で説明) は実装定義として指定されているため、基本的なソース文字がソース ファイルでどのように表現されるかを文書化する実装が必要です。

これは明確にするのに役立つかもしれません:

あなたがそれに慣れていない場合、これも役立つかもしれません:

これは、別の優れた簡潔な - そしてわかりやすい - リファレンスです。

于 2013-02-24T22:12:52.773 に答える