58

私はそれが何をするのか理解しています:文字列リテラルconst wchar_t *を(プレーンな古い文字)ではなく(ワイド文字文字列)として指定しますconst char *が、実際にはどのように定義されていますか?

それはある種のマクロですか?GCCコンパイラの演算子ですか?それはなんですか

4

3 に答える 3

83

リテラルプレフィックスは、サフィックスと同様に、コア言語の一部です。

'a'    // type: char
L'a'   // type: wchar_t

"a"    // type: char[2]
L"a"   // type: wchar_t[2]
U"a"   // type: char32_t[2]

1      // type: int
1U     // type: unsigned int

0.5    // type: double
0.5f   // type: float
0.5L   // type: long double

これはUnicodeとは何のwchar_t関係もないことに注意してください。これは、このトピックに関する私の拡張された暴言です。

于 2012-10-26T12:51:07.673 に答える
20

これはエンコーディングプレフィックスと呼ばれます:

2.14.5文字列リテラル[lex.string]

string-literal
| encoding-prefixopt" s-char-sequenceopt"
| encoding-prefixoptR raw-string
encoding-prefix
| u8
| u
| U
| L

幅の広い文字列リテラルをマークします。

L11) 、などで始まる文字列リテラルL"asdf"は、幅の広い文字列リテラルです。幅の広い文字列リテラルの型は「arrayof n const wchar_t」です。ここで、nは以下に定義する文字列のサイズです。静的な保存期間があり、指定された文字で初期化されます。

于 2012-10-26T12:52:47.930 に答える
7

ここでのLの意味は、ワイド文字ですwchar_t。Lの文字列は、8ビットではなく16ビットでコード化されています。例を見てみましょう。

"A"    = 41
L"A"   = 00 41
于 2014-07-29T19:09:36.333 に答える