6

Visual Studioのマクロと同様_T()に、私は自分の_Lマクロを次のように定義して使用しました:</ p>

#define _L(x)  __L(x)
#define __L(x) L ## x

それは以下のために働きます:

wprintf(_L("abc\n"));

ただし、次のコンパイルエラーが発生します。

wprintf(_L("abc\n""def\n"));

「文字の種類が異なる文字列リテラルは連結できません」と報告されています。
私もしました:

#define _L2(x)  __L2(x)
#define __L2(x) L ## #x
wprintf(_L2("abc\n""def\n"));

コードはコンパイルされますが、\nは改行のエスケープシーケンスとしては機能しません。は\n2文字になり、の出力wprintfは次のようになります。

"abc \ n" "def \ n"

2つの連結されたchar文字列を変換するマクロを作成するにはどうすればよいwchar_tですか?問題は、既存のマクロがいくつかあることです:</ p>

#define BAR  "The fist line\n" \
             "The second line\n"

wcharコンパイル中にそれらを文字列に変換したいと思います。コンパイラはWindowsのICCです。

編集:マクロはgccで機能し
ます_Lが、MSVCとICCは機能しませんでした。これは、コンパイラのバグです。コメントしてくれてありがとう@R..。

4

1 に答える 1

2

私はあなたがこれを行うことができるとは思わない.

マクロは単純なテキスト処理を行うだけです。L最初に追加できますが、2 回"abc\n" "def\n"追加する必要がある 2 つの文字列であるとは言えませんL

文字列を連結するのではなく、コンマで区切ってマクロに渡すと、処理を進めることができます。
L("abc\n", "def\n")

L正確に 2 つの文字列を受け入れるように定義するのは簡単です。
#define L2(a,b) _L(a) _L(b)
任意の数のパラメーターを取得し、適切な場所に s を追加する単一のマクロを持つように一般化することLは可能ですが、より複雑です。Jens Gustedt の P99 マクロで、そのようなことを行う巧妙なマクロを見つけることができます。

于 2012-05-24T08:04:22.787 に答える