【问题标题】:Concate define and string in resources资源中的 concat 定义和字符串
【发布时间】:2012-09-20 04:19:25
【问题描述】:

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

#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”。

【问题讨论】:

  • 我知道 C 和 C++ 之间的区别,请回答问题,如果您不知道如何解决此问题,请走开,不要在这里发垃圾邮件。我使用 C 标签进行营销,因为连接可能在c语言也是。
  • Luchian,如果你无法判断一个问题何时解决了 C 和 C++ 的一个共同特征,而不是专门解决其中一个,你应该从建设性的回答开始,而不是发展 snark.. .

标签: c++ c resources macros concatenation


【解决方案1】:

对于任何关心的人:.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 -- 没有杂散的引号或任何东西。 我希望你可以使用这种技术。

【讨论】:

  • Thanx,我知道这个解决方案,但我的程序是多语言的,不可能定义所有字符串行,我无法在其他地方打开双引号,因为该行包含一些特殊字符,如 (, \n '')。我创建了一些宏,如 STRINGIZE_COMMA2(x,y) STRINGIZE(CONCAT(X,Y)) 等等,但是特殊符号很难做到这一点,有些行我不知道如何加入。
  • 我发现连接和字符串化只能与 boost 预处理器宏一起正常工作(如this SO answer中所述)。可以通过其十六进制表示使用/插入特殊字符(例如,\x2c 表示“,”或 \x20 表示空格)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多