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

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

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

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

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

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";
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]