У меня есть 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();
...
}
Редактировать:
Я сделал что-то вроде следующего, и, похоже, сработал, поскольку я могу распечатать значения в верхней части основного:
Что я могу сделать, чтобы улучшить или сократить объем кода, чтобы это работало?
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);
То, что вы хотите, это использовать constexpr
, Но это не всегда будет работать.
типично std::pow
не является constexpr
(https://en.cppreference.com/w/cpp/numeric/math/pow).
Если вы действительно хотите иметь вычисления во время компиляции, вам нужно реализовать эти отсутствующие функции как constexpr
сам. Действительно, стандартная библиотека обычно не constexpr
, так что он все равно будет делать вещи во время выполнения. Посмотри на https://www.youtube.com/watch?v=CRDNPwXDVp0&фраги = пл% 2Cwn для получения дополнительной информации о том, что ждет нас в будущем.
Других решений пока нет …