fon*_*ini 2 c++ stringification c-preprocessor variadic-macros
我想在compile命令中传递一个版本字符串:
$ g++ -Wall -D VERSION="2013-12-03 02:15:21, commit cb060df" -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我有以下内容:
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为VERSION宏中有一个逗号,所以看起来我传递了两个参数TOSTR()(显然,VERSION宏只有在STRINGIFY()作为一个唯一参数传递后才会被扩展).
我在这里找到的以下方法也不起作用:
#define CONCAT(...) __VA_ARGS__
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(CONCAT(x))
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
因为这似乎是相同的
#define VERSIONSTR "CONCAT(2013-12-03 02:15:21, commit cb060df)"
Run Code Online (Sandbox Code Playgroud)
也就是说,宏CONCAT()不会扩展.
注1:我宁愿不在命令行中传递一个C字符串,因为版本字符串实际上是动态生成的,它可能包含一些引号.这意味着只写g++ -D VERSION=\""$(GENERATED_STRING)"\"而不是对传递的参数进行字符串化是行不通的.
注2:如果有人在没有任何预处理器宏的情况下找到了这样做的方法,我会非常高兴.
您可以编写TOSTR_宏来获取变量参数:
#define TOSTR_(x...) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
此代码已经过测试,适用于Apple LLVM 5.0版.