Concat在资源中定义和字符串

时间:2012-09-28 09:31:06

标签: c++ c resources macros concatenation

我有一个资源文件,需要使用连接宏和字符串创建字符串定义,类似这样

#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"没有平均报价。

1 个答案:

答案 0 :(得分:4)

对于任何关心的人:.rc文件是来自MFC项目的资源文件,用于定义UI元素,例如对话框布局。它使用与C ++相同的预处理器,但它不共享C ++的语法 - 并且在CAPTION字段的窗口中,两个字符串文字不会通过并置它们来连接。在字符串文字中,两个双引号实际上是一个生成一个双引号字符的转义序列。字面意思:

"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 - 没有杂散的引号或任何东西。 我希望你能使用这种技术。