Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有编译时计算全局变量的函数_C++_Function_Global_Constexpr_Compile Time - Fatal编程技术网

C++ C++;具有编译时计算全局变量的函数

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

我有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 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上查看它是否生成编译时常量。