C ++ есть функция на время компиляции для вычисления глобальных переменных - PullRequest
0 голосов
/ 21 октября 2018

У меня есть 3 глобальные переменные, которые я хочу вычислить во время компиляции без необходимости сначала получать результаты и назначать глобальные переменные вручную.

Способ, которым я в настоящее время настроил это, есть функция с именем Init (), которая просто вычисляет 3 переменные, и эта функция Init () вызывается в верхней части Main.То, что я пытался сделать, это добавить constexpr в начало функции, но печать значений перед вызовом Init () просто имеет переменные равными 0.

Что было бы лучшим способом, если он вообще есть,чтобы функция Init () в следующем коде работала во время компиляции и чтобы уже были вычислены 3 глобальных значения в начале программы.

Пример кода:

static const int length = 8;
static const int seed = 40;

long long key1, key2, key3; // I want these to be calculated at compile-time instead of run-time if possible

void Init() {
    key1 = pow(seed, length);
    key2 = key1 * seed;
    key3  = key2 * seed;
}

...
void main(int argc,char * argv[]) {
    Init();
    ...
}

Редактировать:

Я сделал что-то вроде следующего, и, похоже, сработал, поскольку я могу напечатать значения в верхней части main: Могу ли я что-нибудь сделать, чтобы улучшить или сократить количество кода, чтобы это работало?

constexpr long long calcKey1() {
    long long key1 = 1;
    for (int i = 0; i < length - 2; i++)
        key1 *= seed;

    return key1;
}

constexpr long long calcKey2(const long long key1) {
    return key1* seed;
}

constexpr long long calcKey3(const long long key2) {
    return key2 * seed;
}

constexpr long long key1 = calcKey1();
constexpr long long key2 = calcKey2(key1);
constexpr long long key3 = calcKey3(key2);

1 Ответ

0 голосов
/ 21 октября 2018

То, что вы хотите, это использовать constexpr.Но это не всегда будет работать.

Обычно std::pow это не constexpr (https://en.cppreference.com/w/cpp/numeric/math/pow).

Если вы действительно хотите иметь вычисления во время компиляции, вам нужно реализовать эти отсутствующиефункционирует как constexpr. Действительно, стандартная библиотека, как правило, не constexpr, поэтому она все равно будет делать что-то во время выполнения. Посмотрите на https://www.youtube.com/watch?v=CRDNPwXDVp0&frags=pl%2Cwn для получения дополнительной информации о том, что будет в будущем.

...