Cpp 文字列リテラル
C++に戻る
本来の表記は「C++(Cpp) 文字列リテラル」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。 |
※このページではC++にのみ存在する機能として、記事タイトルがC++ 文字列リテラルになっています。
文字列リテラル
文字列リテラルのリテラル(Literal)とは英語で文字通りのという意味があります。プログラムでは文字列そのものを表す表現という意味でもあり、初期化や関数の引数で文字列を指定するときの表現となっています。C++ではダブルクォーテーションで囲うものが有名です。
"abc"
はいはい。見たことあります。こういう表記ですね。みたことない?。そっかそっか。まだまだ知らない人もいるんだね。文字列を引数にとる関数を呼び出すときは、以下のようにも表記できるってことです。
function("abc");
おー。ダブルクォーテーションの使い方。これこれ。これを見たかったね。
ここからがこの記事の本番です。ダブルクォーテーションで囲うのなんて、みんな知ってるっつうのね。プログラムやったことある人ならね。このリテラルっていうものには、たくさんの種類が準備されているのが、C++なのです。それをここで全部知っていこうとする記事です。リテラル。深い!
まずは、wchar_t型の引数の場合はこうですね。Unicodeの範囲が使えるよね。
function(L"日本語もハングル한국어もいけるニダっし、そのほかの謎の国際言語Киргиз тилиってね。");
このようにL""とするだけで使えます。そしてマイクロソフトが考えた_TでUnicodeを使うプロジェクトの場合はL""と同じで、そうでないプロジェクトに対しては""で扱うみたいな方法があって
function(_T("Hello, World!"));
という記法です。これは以下の設定に従います。
Character Set (文字セット):
プロジェクトのプロパティを開きます。 「構成プロパティ」 -> 「詳細設定」 -> 「文字セット」 「文字セット」が「Unicode 文字セットを使用する」の場合、_T マクロはワイド文字列 (wchar_t型) に展開されます。
Preprocessor Definitions (プリプロセッサの定義):
_UNICODE マクロが定義されていることを確認します。 プロジェクトのプロパティ -> 「構成プロパティ」 -> 「C/C++」 -> 「プリプロセッサ」 -> 「前処理済みのディフェクト」 _UNICODE が含まれていることを確認します。
これらの設定によって、_T マクロは _UNICODE マクロの定義状態に基づいて、適切な文字列型に展開されます。
ね。いろいろあるでしょ。でも、ここまではまだ基本です。プログラマなら知っておいてよっていうレベルね。まだまだあります。さきにいろいろな説明を省略してどんなものがあるかをずらっと並べます。
char8_t utf8 = u8'a' ;
char16_t utf16 = u'あ' ;
char32_t utf32 = U'あ' ;
function(R"(a
b
c)");
function(RL"(い
ろ
は)");
// string
auto str = "Hello, World!"s ;
// u8string
auto u8str = u8"こんにちは世界! Hello, World!"s ;
// u16string
auto u16str = u"こんにちは世界! Hello, World!"s ;
// u32string
auto u32str = U"こんにちは世界! Hello, World!"s ;
// wstring
auto wstr = L"こんにちは世界! Hello, World!"s ;
// string_view
auto str = "Hello, World!"sv ;
// u8string_view
auto u8str = u8"こんにちは世界! Hello, World!"sv ;
// u16string_view
auto u16str = u"こんにちは世界! Hello, World!"sv ;
// u32string_view
auto u32str = U"こんにちは世界! Hello, World!"sv ;
// wstring_view
auto wstr = L"こんにちは世界! Hello, World!"sv ;
ね。結構あるでしょ。知らないリテラルあった!って人は衝撃だよね。そう、標準でも知っておかないといけないリテラルは多いんです。これから少しづつ紹介します。MediaWikiの構文解析強調表示システムでもRLはおかしくなってるのでちゃんとは理解できていないって事ですね。
C++に戻る