如何将包含逗号的字符串字符串化

How to stringify a string which contains a comma?

本文关键字:字符串 包含逗      更新时间:2023-10-16

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

$ 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()后才会展开)。

我在这里发现的以下方法也不起作用:

#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版上测试并运行。

__VA_ARGS__必须在每个调用中:

#define _STRINGIZE(...) #__VA_ARGS__
#define STRINGIZE(...) _STRINGIZE(__VA_ARGS__)