私はそれが何をするのか理解しています:文字列リテラルconst wchar_t *
を(プレーンな古い文字)ではなく(ワイド文字文字列)として指定しますconst char *
が、実際にはどのように定義されていますか?
それはある種のマクロですか?GCCコンパイラの演算子ですか?それはなんですか?
私はそれが何をするのか理解しています:文字列リテラルconst wchar_t *
を(プレーンな古い文字)ではなく(ワイド文字文字列)として指定しますconst char *
が、実際にはどのように定義されていますか?
それはある種のマクロですか?GCCコンパイラの演算子ですか?それはなんですか?
リテラルプレフィックスは、サフィックスと同様に、コア言語の一部です。
'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
関係もないことに注意してください。これは、このトピックに関する私の拡張された暴言です。
これはエンコーディングプレフィックスと呼ばれます:
string-literal
:
|encoding-prefix
opt
"s-char-sequenceopt
"
|encoding-prefix
opt
Rraw-string
encoding-prefix
:
|u8
|u
|U
|L
幅の広い文字列リテラルをマークします。
L
11) 、などで始まる文字列リテラルL"asdf"
は、幅の広い文字列リテラルです。幅の広い文字列リテラルの型は「arrayofn
const wchar_t
」です。ここで、nは以下に定義する文字列のサイズです。静的な保存期間があり、指定された文字で初期化されます。
ここでのLの意味は、ワイド文字ですwchar_t
。Lの文字列は、8ビットではなく16ビットでコード化されています。例を見てみましょう。
"A" = 41
L"A" = 00 41