反向预处理器字符串化运算符
Reverse preprocessor stringizing operator
在一个SDK的一个包含文件中定义了大量宽字符串数字常量,我无法修改这些常量,但经常更新和更改。所以我不能用数字声明数字定义,因为它每隔几天就完全不同,我不想('不允许)应用任何脚本进行更新
如果情况正好相反,并且常量将被定义为一个数字,我可以简单地通过#预处理器运算符制作字符串。
我不会使用 atoi,也不想制作任何变量,我只需要预处理器最好以数字形式提供的常量。
我知道没有反向字符串化运算符,但是没有办法通过预处理器将字符串转换为令牌(数字)?
无法在预处理器中"取消字符串化"。但是,至少可以使用用户定义的文本从字符串文本中获取常量表达式。下面是使用从字符串文本中获取的值初始化 enum
值的示例,以证明解码在编译时发生,但不是在预处理期间:
#include <iostream>
constexpr int make_value(int base, wchar_t const* val, std::size_t n)
{
return n? make_value(base * 10 + val[0] - L'0', val + 1, n -1): base;
}
constexpr int operator"" _decode(wchar_t const* val, std::size_t n)
{
return make_value(0, val, n);
}
#define VALUE L"123"
#define CONCAT(v,s) v ## s
#define DECODE(d) CONCAT(d,_decode)
int main()
{
enum { value = DECODE(VALUE) };
std::cout << "value=" << value << "n";
}
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 是否可以将带有字符串化运算符的宏转换为 constexpr?
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 重载 std::字符串运算符+ 用于打印枚举名称
- <<运算符优先级与字符串比较
- C++ |<<运算符重载和打印字符串
- ">"运算符和"<"运算符如何进行字符串比较?
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 重载加法运算符(使用函数向对象添加字符串)
- 使用短运算符的字符串连接有区别吗?
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- 使用 cout 运算符重载字符串
- 如何使用运算符>>在自定义字符串中输入多个单词?
- C++中的字符串类: +运算符中的错误?
- 在 c++ 中对字符串进行加号运算符
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- R 值重载运算符字符串赋值错误
- (c++)更长的算术运算符字符串