C++ 反向预处理器字符串化运算符

C++ 反向预处理器字符串化运算符,c++,c-preprocessor,stringification,C++,C Preprocessor,Stringification,在一个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";
}
#包括
constexpr int make_值(int base,wchar_t const*val,std::size_t n)
{
返回n?make_值(base*10+val[0]-L'0',val+1,n-1):base;
}
constexpr int运算符“”\u解码(wchar\u t const*val,std::size\t n)
{
返回make_值(0,val,n);
}
#定义值L“123”
#定义CONCAT(v,s)v##s
#定义解码(d)CONCAT(d,_解码)
int main()
{
枚举{值=解码(值)};

std::你能举一个小例子吗(不必是真实的值/名称,只需在代码中描述你想做什么)太棒了!我甚至不知道用户定义的文字-多么有用。