我想在编译命令中传递一个版本字符串:
$ 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:如果有人找到一种完全没有任何预处理器宏的方法,我会非常高兴。