【问题标题】:Convert a macro argument into a string constant and take into account commas将宏参数转换为字符串常量并考虑逗号
【发布时间】:2015-09-11 10:22:47
【问题描述】:

假设我有一个像这样的 C 宏定义的产品版本:

#define FOO_VERSION 1,0,0,1

我想在运行时打印它:

#define STRING_VALUE(x) #x

int main()
{
    std::cout << STRING_VALUE(FOO_VERSION) << std::endl;
}

这将输出一个字符串“FOO_VERSION”,而不是“1,0,0,1”。宏 不会替换参数“FOO_VERSION”。所以我再试一次 这个:

#define STRING_VALUE(x) STRING_VALUE__(x)
#define STRING_VALUE__(x) #x

int main()
{
    std::cout << STRING_VALUE(FOO_VERSION) << std::endl;
}

在 Visual C++ 2013 中有效。

这是一个跨平台的应用程序,虽然只有五个 代码行。当我使用 clang 编译代码时,一个 compile- 出现时间错误:“提供给类函数的参数过多 宏调用”。我猜原因是在 'FOO_VERSION'。所以第三个版本:

#define STRING_VALUE(x) STRING_VALUE__(x)
#define STRING_VALUE__(a, b, c, d) #a "," #b "," #c "," #d

int main()
{
    std::cout << STRING_VALUE(FOO_VERSION) << std::endl;
}

此代码在 clang 中有效,但 Visual C++ 会输出警告: “宏 'STRING_VALUE__' 的实际参数不足” 在 编译时,当然运行时输出不对。

我的问题:这种预处理器行为是否已定义?我可不可以有一个 STRING_VALUE 宏的通用版本?

【问题讨论】:

    标签: c++ c macros


    【解决方案1】:

    您可以将参数视为单个可变参数宏:

    #define FOO_VERSION 1,0,0,1
    
    #define STRING_VALUE(...) STRING_VALUE__(__VA_ARGS__)
    #define STRING_VALUE__(...) #__VA_ARGS__
    

    这似乎适用于 gcc 和 Visual C++。

    【讨论】:

    • 我怎么没想到?
    猜你喜欢
    • 2017-02-25
    • 2011-10-03
    • 2020-09-22
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2012-10-27
    相关资源
    最近更新 更多