Оператор обратного препроцессора строкового преобразования

В одном включаемом файле в одном SDK определено множество широкострочных числовых констант, которые я не могу модифицировать, но которые часто обновляются и изменяются. Поэтому я не могу объявить числовое определение с помощью чисел, потому что оно совершенно другое каждые несколько дней, и я не хочу (мне не разрешено) применять какие-либо сценарии для обновления.

Если бы было наоборот и константа была бы определена как число, я могу просто сделать строку # оператором препроцессора.

Я не буду использовать atoi, и я не хочу создавать какие-либо переменные, мне просто нужны константы в числовой форме, лучше всего с помощью препроцессора.

Я знаю, что нет оператора обратной строки, но нет ли способа преобразовать строку в токен (число) с помощью препроцессора?


person V-X    schedule 19.09.2013    source источник
comment
Можете ли вы привести небольшой пример (это не обязательно должны быть настоящие значения/имена, просто что-то, чтобы описать в коде, что вы хотите сделать)   -  person Mats Petersson    schedule 20.09.2013


Ответы (1)


В препроцессоре нет способа "разобрать" строку. Однако вы можете получить, по крайней мере, константные выражения из строковых литералов, используя пользовательские литералы. Ниже приведен пример инициализации значения 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";
}
person Dietmar Kühl    schedule 19.09.2013
comment
это гениально! Я даже не знал о пользовательских литералах - насколько они полезны. - person Jerry Jeremiah; 20.09.2013