在一个 SDK 的一个包含文件中定义了许多宽字符串数字常量,我无法修改,但经常更新和更改。所以我不能用数字声明数字定义,因为它每隔几天就完全不同,我不想('不允许)应用任何脚本进行更新
如果反过来并且常量将被定义为一个数字,我可以简单地通过 # 预处理器运算符创建字符串。
我不会不使用 atoi 也不想制作任何变量,我只需要预处理器最好的数字形式的常量。
我知道没有反向字符串化运算符,但是没有任何方法可以通过预处理器将字符串转换为令牌(数字)吗?
在一个 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";
}