static TCHAR szWindowClass[] = L"foo";
L
文字列に「接着」されます"foo"
。どうして?私が慣れている関数やマクロは次のようなものですL("foo");
どうしてLが紐に接着されるのか誰かに説明してもらえますか?
L
マクロではなく、ワイド(wchar_t
、 "Unicode")文字列リテラルの標準プレフィックスです。概念は、リテラルの接尾辞、リテラルのL
接尾辞などに似ています1。long int
f
float
ちなみに、sを使用している場合は、直接TCHAR
使用しないでください。L
代わりに、_T()
orTEXT()
マクロを使用する必要があります。L
これは、アプリケーションが「Unicode用」にコンパイルされている場合(つまり、TCHAR
として定義されている場合)はリテラルの先頭に追加されWCHAR
、コンパイルターゲットが「ANSI」(TCHAR
として定義されている場合)の場合は何も追加されませんCHAR
。
これはマクロではなく、コンパイラが特別な意味を持つプレフィックスとして認識するトークンです。
同じことが、たとえば、のようにリテラルl
を生成する接尾辞としても起こります。long
long 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[].
また、新しい文字列リテラルに関するウィキペディアの記事