【问题标题】:How to concatenate two wide strings using a macro in C?如何使用 C 中的宏连接两个宽字符串?
【发布时间】:2010-09-30 13:43:20
【问题描述】:

我想用一个宏来连接两个宽字符串,所以我定义了一些宏:

#define VERSION_MAJOR 1
#define VERSION_MINOR 1
#define VERSION_BUILD 0
#define VERSION_REVISION 0


#define _STR(s) #s
#define STR(s) _STR(s)

#define _TOWSTRING(x) L##x
#define TOWSTRING(x) _TOWSTRING(x)


//http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string
#define PRODUCT_ELASTOS_VERSION STR(VERSION_MAJOR) "." \
                                STR(VERSION_MINOR) "." \
                                STR(VERSION_BUILD) "." \
                                STR(VERSION_REVISION)

现在我想使用宏 PRODUCT_ELASTOS_VERSION 定义一个新的宏 PRODUCT_ELASTOS_VERSION_W,它的值应该是 L"1.1.0.0"。那么我该如何定义这个宏呢? TOWSTRING(PRODUCT_ELASTOS_VERSION) 是错误的答案。

如果我想连接字符串,我应该怎么写? L"v" TOWSTRING(PRODUCT_ELASTOS_VERSION) 无法获取宽字符串 L"v1.1.0.0"。

【问题讨论】:

  • 请注意,标识符开头的_ 后跟大写字母是保留字(虽然我不确定,但只能是 c++)。您可以将_ 放在末尾,例如STR_TOWSTRING_
  • 另外,REVISION 不应该出现在 BUILD 之后吗?关于保持构建计数,看看here也许它可能有用(或者你可能有更好的主意!)

标签: c macros


【解决方案1】:

首先,PRODUCT_ELASTOS_VERSION 不会扩展为“1.1.0.0”,而是扩展为

"1" "." “1”“。” “0”“。” “0”

保持相同的结构,您可以定义另一个扩展为的标识符

L"1" L"." L"1" L"。" L"0" L"。" L"0"

#define _LSTR(s) L ## #s
#define LSTR(s) _LSTR(s)

#define ANOTHER_IDENTIFIER LSTR(VERSION_MAJOR) L"." \
                           LSTR(VERSION_MINOR) L"." \
                           LSTR(VERSION_BUILD) L"." \
                           LSTR(VERSION_REVISION)

【讨论】:

  • 这不是最好的方法,因为如果我定义 PRODUCT_NAME "hello wold",那么 wprintf(L"%s\n", L"v" TOWSTRING(PRODUCT_NAME)) 可以,但是 wprintf( L"%s\n", TOWSTRING(PRODUCT_VERSION)) 错误。我希望每个宏都能以相同的方式工作。
猜你喜欢
  • 2019-11-06
  • 2011-01-12
  • 2011-07-12
  • 2012-01-17
  • 1970-01-01
  • 2010-12-16
  • 2017-10-03
  • 2017-08-27
相关资源
最近更新 更多