如何将包含逗号的字符串字符串化
How to stringify a string which contains a comma?
我想在编译命令中传递一个版本字符串:
$ 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__)
相关文章:
- 编译包含字符串的代码时遇到问题
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- C++ 创建包含链表和字符串的对象的链接列表时出错
- C++-字符串是否包含一个带有简单循环的单词
- 编辑字符串以包含括号 c++ 之间的变量
- 使用提升元解析字符串解析包含的文件
- 当字符串包含 %2C 时,在 c++ 中不完整的 std::string
- C++ 检查 UTF8 字符串包含指定的字符
- 将文件作为字符串包含在内
- 为什么string.empty()在字符串包含一个值时评估为true
- boost::p rogram_option::store 在选项字符串包含混合语言字符时引发异常
- 在 c++ 中将字符串(包含字符和浮点数)转换为双精度
- 将字符串(包含数字)转换为整数并返回该整数
- 如果输入字符串包含"%",则vsntprintf_s崩溃
- 当一个字符串包含另一个字符串的一部分时比较字符串
- 如果字符串包含多个 ,如何在每25个换行符( )上分割字符串
- 输出字符串包含奇怪的字符
- 当字符串包含多个NUL字符时,如何获取c_str(用于发送)
- 乘法的字符串[包含整数],输出也存储在字符串中,如何