c++ - 将宏参数转换为字符串常量并考虑逗号

标签 c++ c macros

假设我有一个像这样的 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 编译代码时,编译- 出现时间错误:“提供给类似函数的参数太多 宏调用”。我想原因是在中定义的逗号 '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 宏的通用版本?

最佳答案

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

#define FOO_VERSION 1,0,0,1

#define STRING_VALUE(...) STRING_VALUE__(__VA_ARGS__)
#define STRING_VALUE__(...) #__VA_ARGS__

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

关于c++ - 将宏参数转换为字符串常量并考虑逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32521173/

相关文章:

debugging - 如何在 Rust 中打印表达式及其值?

c - 为什么全局变量会翻倍两次?

c++ - 为什么在具有引用字段的类中隐式删除复制运算符?

c++ - Makefile.am 的 EXTRA_DIST 重复目录名

c++:如何将换行插入到 sprintf 连接中?

c - 这个程序是如何设法分配这么多内存的?

c++ - 在 ncurses 中提取带有属性的宽字符

javascript - 在 Javascript 中分解一个数字

c - 为什么这里不发生整数除法截断?

macros - 为什么在这个宏定义中需要@符号?