10
static TCHAR szWindowClass[] = L"foo";

L文字列に「接着」されます"foo"。どうして?私が慣れている関数やマクロは次のようなものですL("foo");

どうしてLが紐に接着されるのか誰かに説明してもらえますか?

4

6 に答える 6

18

Lマクロではなく、ワイド(wchar_t、 "Unicode")文字列リテラルの標準プレフィックスです。概念は、リテラルの接尾辞、リテラルのL接尾辞などに似ています1long intffloat

ちなみに、sを使用している場合は、直接TCHAR使用しないでください。L代わりに、_T()orTEXT()マクロを使用する必要があります。Lこれは、アプリケーションが「Unicode用」にコンパイルされている場合(つまり、TCHARとして定義されている場合)はリテラルの先頭に追加されWCHAR、コンパイルターゲットが「ANSI」(TCHARとして定義されている場合)の場合は何も追加されませんCHAR


  1. 私の意見では、これは紛らわしいですが、なぜ算術型のサフィックスとワイド文字列リテラルのプレフィックスなのですか?
于 2012-11-14T13:12:27.920 に答える
4

これはマクロではなく、コンパイラが特別な意味を持つプレフィックスとして認識するトークンです。

同じことが、たとえば、のようにリテラルlを生成する接尾辞としても起こります。longlong x = 42l;

于 2012-11-14T13:14:32.423 に答える
4

これは、マクロではないのと同じように、マクロではありません。 42ul「foo」がワイド文字列であることをコンパイラに通知します。

ちなみに、「幅の広い文字列」が実際に何であるかはそれほど明確に定義されていないため、移植性はありません。APIの理由でTCHAR/を使用する必要ない限りL"foo"、C ++ 11 Unicodeサポート(C ++ 11サポートが利用可能な場合):( u8"foo"UTF-8)またはU"foo"(UTF-32)に加えて、適切な文字列/配列タイプ。

個人的なアドバイス:UTF-16は使用しないでください。「幅の広い」文字列をめぐる議論からも明らかなように、ほとんどの人はそれを本当に理解していません。;-)

于 2012-11-14T13:15:13.637 に答える
1

これはどう?

#ifdef _UNICODE

#define L(str) L##str

#else

#define L(str) str

#endif

于 2016-01-13T15:06:58.880 に答える
0

@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;
于 2017-02-07T10:33:18.660 に答える
0

この質問に遅れましたが、これは何年も前に私を悩ませました。これは、Lとその他の定義を示すいくつかのドキュメントへのリンクです。

cppreference.com文字列リテラル

L " (unescaped_character|escaped_character)* " (2)
2) Wide string literal. The type of a L"..." string literal is const wchar_t[].

また、新しい文字列リテラルに関するウィキペディアの記事

于 2017-02-13T20:19:34.540 に答える