【问题标题】:How to expand macro value to wide string?如何将宏值扩展为宽字符串?
【发布时间】:2014-01-14 14:31:56
【问题描述】:

假设我有一个宏

#define CLASS_NAME ItemsList

稍后我想使用它的值,不是作为符号,而是作为宽字符串。我的问题开始了。当我简单地编写时(在常规 C++ 代码中,而不是在宏定义中):

L#CLASS_NAME

编译器给我一个错误,说令牌# 不是这里预期的。当我为它写代理时

#define WSTRING(S) L#S

并使用它

WSTRING(CLASS_NAME)

我将获得内容为“CLASS_NAME”的宽字符串。我想扩展宏,意思是获取它的值,而不是转换宏名称。

那么如何正确地做到这一点(Visual Studio 2012)?

【问题讨论】:

    标签: c++ string visual-studio-2012 macros


    【解决方案1】:

    如果你想要L"ItemsList",那么你可以使用:

    #define CONCAT2(X, Y) X##Y
    #define CONCAT(X, Y) CONCAT2(X, Y)
    #define STRINGIFY2(X) #X
    #define STRINGIFY(X) STRINGIFY2(X)
    #define WIDEN(X) CONCAT(L, STRINGIFY(X))
    

    然后写WIDEN(CLASS_NAME)

    【讨论】:

    • 您的定义有误,WIDEN 应扩展为 WIDEN2。但更重要的问题是 WIDEN(CLASS_NAME) 写的将扩展为 L"CLASS_NAME",因为 # 处于扩展的第一级。它必须在第二级扩展才能真正扩展参数。
    • @JanHudec 对。
    • 谢谢,但即使使用固定类型,我仍然会得到CLASS_NAME
    • 百万感谢(我不会自己解决它,没办法 :-D),它就像一个魅力。
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2011-10-03
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多