我有一个资源文件,需要在需要时使用连接宏和字符串创建字符串定义,如下所示
#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"
但需要简单的“Hello World”,没有平均报价。
对于任何关心的人:.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
...
这样,对话框的标题最终看起来像你好世界-- 没有杂乱的引号或任何东西。
我希望你能使用这个技巧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)