我想在编译命令中传递一个版本字符串:
$ 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/