我有 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);
你想要的是使用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