C++ C++;具有编译时计算全局变量的函数
我有3个全局变量,我希望在编译时计算它们,而不需要先得到结果,然后手动分配全局变量 我目前的设置方式是有一个名为Init()的函数,它只计算3个变量,这个Init()函数在Main的顶部附近调用。 我尝试将constexpr添加到函数的前面,但在调用Init()之前打印值,变量为0 在编译时运行下面代码中的函数Init(),并在程序开始时计算3个全局变量,如果有的话,最好的方法是什么 示例代码:C++ C++;具有编译时计算全局变量的函数,c++,function,global,constexpr,compile-time,C++,Function,Global,Constexpr,Compile Time,我有3个全局变量,我希望在编译时计算它们,而不需要先得到结果,然后手动分配全局变量 我目前的设置方式是有一个名为Init()的函数,它只计算3个变量,这个Init()函数在Main的顶部附近调用。 我尝试将constexpr添加到函数的前面,但在调用Init()之前打印值,变量为0 在编译时运行下面代码中的函数Init(),并在程序开始时计算3个全局变量,如果有的话,最好的方法是什么 示例代码: static const int length = 8; static const int seed
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 long calcKey1(){
长键1=1;
对于(int i=0;i
您想要的是使用constexpr
。但这并不总是有效的
通常std::pow
不是constepr
()
如果您真的想进行编译时计算,您需要自己实现这些缺少的函数作为
constexpr
。事实上,标准库通常不是constexpr
,因此它仍然会在运行时做一些事情。查看更多关于未来存储内容的信息。尽管显示的代码不是真正的代码,“…以下代码在编译时运行…”-代码不在编译时运行;它是在编译时构建的。你的帖子回避了一个问题,你到底想解决什么问题?因为,这是我文章的第一句话,“我有3个全局变量,我希望在编译时计算”如果可能的话,我希望在程序启动之前已经计算过这3个变量。@TJ8您需要为每个变量设置一个constexpr
函数,返回一个适当的值。您还需要将这些变量标记为constexpr
,以便在编译时计算中重用这些变量。最后但并非最不重要的一点是,您需要提供constepr
版本的pow()
(使用递归模板可能会实现这一点)。我对我的原始帖子进行了编辑,其中包含了您的建议,看起来很有效。这是最理想的方式还是可以缩短?卡蒙伙计们。给出你投票反对的理由。。所以像我这样的人不明白发生了什么事情,他们可以理解。--@Yucel_K这不是一个完整的有用答案。有趣的信息都隐藏在链接中(随着时间的推移,链接很容易失效)。这不是我们要找的。因此,我对答案进行了DV,并将其标记为非常低的质量。转发到CPPFREFERENCE和来自cppcon的视频(指示编译时表达式将发生什么情况)是低质量的?那么你的答案是什么?至少我的答案来源正确。@πάνταῥεῖ 啊。。我认为答案是错的,我想知道为什么答案是错的。感谢您的澄清。您也可以在godbolt.org上查看它是否生成编译时常量。