static TCHAR szWindowClass[] = L"foo";
L文字列に「接着」されます"foo"。どうして?私が慣れている関数やマクロは次のようなものですL("foo");
どうしてLが紐に接着されるのか誰かに説明してもらえますか?
Lマクロではなく、ワイド(wchar_t、 "Unicode")文字列リテラルの標準プレフィックスです。概念は、リテラルの接尾辞、リテラルのL接尾辞などに似ています1。long intffloat
ちなみに、sを使用している場合は、直接TCHAR使用しないでください。L代わりに、_T()orTEXT()マクロを使用する必要があります。Lこれは、アプリケーションが「Unicode用」にコンパイルされている場合(つまり、TCHARとして定義されている場合)はリテラルの先頭に追加されWCHAR、コンパイルターゲットが「ANSI」(TCHARとして定義されている場合)の場合は何も追加されませんCHAR。
これはマクロではなく、コンパイラが特別な意味を持つプレフィックスとして認識するトークンです。
同じことが、たとえば、のようにリテラルlを生成する接尾辞としても起こります。longlong x = 42l;
これは、マクロではないのと同じように、マクロではありません。 42ul「foo」がワイド文字列であることをコンパイラに通知します。
ちなみに、「幅の広い文字列」が実際に何であるかはそれほど明確に定義されていないため、移植性はありません。APIの理由でTCHAR/を使用する必要がない限りL"foo"、C ++ 11 Unicodeサポート(C ++ 11サポートが利用可能な場合):( u8"foo"UTF-8)またはU"foo"(UTF-32)に加えて、適切な文字列/配列タイプ。
個人的なアドバイス:UTF-16は使用しないでください。「幅の広い」文字列をめぐる議論からも明らかなように、ほとんどの人はそれを本当に理解していません。;-)
これはどう?
#ifdef _UNICODE
#define L(str) L##str
#else
#define L(str) str
#endif
@DooHyeokKimに基づいて改善する
#define DIAG "diag"
// innerally macro
#define __W(quote_string) L ## quote_string
// robust macro
#define _W(quoted_string_or_defined_string) __W(quoted_string_or_defined_string)
//std::wcout << _W(DIAG) << ", " << _W("_W(\"diag2\")") << ", " << __W("__W(\"diag3\")") <<std::endl;
この質問に遅れましたが、これは何年も前に私を悩ませました。これは、Lとその他の定義を示すいくつかのドキュメントへのリンクです。
L " (unescaped_character|escaped_character)* " (2)
2) Wide string literal. The type of a L"..." string literal is const wchar_t[].
また、新しい文字列リテラルに関するウィキペディアの記事