c++ - 如何将包含逗号的字符串字符串化?

标签 c++ c-preprocessor stringification variadic-macros

我想在编译命令中传递一个版本字符串:

$ g++ -Wall -D VERSION="2013-12-03 02:15:21, commit cb060df" -o main main.cpp

在我的代码中,我有以下内容:

#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)

这不起作用,因为 VERSION 宏中有一个逗号,所以看起来我正在将两个参数传递给 TOSTR()(显然, VERSION 宏只有在作为一个唯一参数传递给 STRINGIFY() 后才会展开。

我在here中找到的以下方法也不起作用:

#define CONCAT(...) __VA_ARGS__
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(CONCAT(x))
#define VERSION_STR STRINGIFY(VERSION)

因为这看起来和

#define VERSIONSTR "CONCAT(2013-12-03 02:15:21, commit cb060df)"

也就是说,宏 CONCAT() 不会展开。

注意 1:我宁愿不在命令行中传递 C 字符串,因为版本字符串实际上是动态生成的,它可能包含一些引号。这意味着仅编写 g++ -D VERSION=\""$(GENERATED_STRING)"\" 而不是将传递的参数字符串化是行不通的。

注 2:如果有人找到一种完全不需要任何预处理器宏的方法,我将非常高兴。

最佳答案

您可以编写 TOSTR_ 宏来获取可变参数:

#define TOSTR_(x...) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)

此代码已经过测试并适用于 Apple LLVM 5.0 版。

关于c++ - 如何将包含逗号的字符串字符串化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20384709/

相关文章:

c++ - #define值的大小

objective-c - #if TRUE vs #if YES vs #if 1 在 Objective-C 中有什么不同?

c++ - 试图理解 C++11 中宏、模板和枚举的复杂使用

objective-c - Objective-C 字符串文字的预处理器宏值

perl - 重载字符串化和 utf8 标志

c - 使用 C 预处理器读取变量

c++ - 获取长度字符串的范围百分比

c++ - 我如何创建一个线程安全的 QOffscreenSurface 供 OpenGl 使用

c++ - 如何以编程方式查找动态库文件的位置?

C 预处理 : pasting valid token and value of a token