4

連結マクロと文字列を使用して文字列を定義する必要があるリソースファイルがあります。

#define _STRINGIZE(n) #n
#define STRINGIZE(n) _STRINGIZE(n)
#define Word_ Word
100 DIALOGEX 0, 0, 172, 118
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Hello"STRINGIZE(Word_)=>"Hello"Word" 

しかし、平均的な引用符のない単純な「HelloWord」が必要でした。

4

1 に答える 1

4

気にする方へ: .rc ファイルは、ダイアログ レイアウトなどの UI 要素を定義する MFC プロジェクトのリソース ファイルです。C++ と同じプリプロセッサを使用しますが、C++ の構文を共有しません。また、ウィンドウの CAPTION フィールドでは、2 つの文字列リテラルを単に並置するだけでは連結しません。文字列リテラル内の 2 つの二重引用符は、実際には 1 つの二重引用符文字を生成するエスケープ シーケンスです。したがって、リテラル:

"Hello""World"

最終的に次のようになります

Hello"World

ダイアログ ウィンドウのキャプション。

与えられた例の問題:

CAPTION "Hello"STRINGIZE(Word_)

「Hello」の最後の二重引用符を削除する必要がありますが、プリプロセッサはこれを実行できません。ただし、「Hello」をマクロに含めることが許可されている場合は、連結が可能です。まず、これらのマクロを定義しました。

#define CONCAT(a,b) a##b
#define STRINGIZE_(x) #x
#define STRINGIZE(x) STRINGIZE_(x)

次に、ダイアログ レコード内で次のようにします。

  ...
EXSTYLE WS_EX_APPWINDOW
CAPTION STRINGIZE(CONCAT(Hello,World))
FONT 10, "Segoe UI Semibold", 600, 0, 0x0
  ...

これにより、ダイアログのキャプションは最終的にHelloWorldのようになります。不要な引用符などはありません。このテクニックを使っていただければ幸いです。

于 2012-09-28T22:09:54.477 に答える