静态短引用在递归函数中产生错误

Static short reference yields an error in recursive function

本文关键字:错误 递归函数 引用 静态      更新时间:2023-10-16

以下是整个来源:

#include <iostream>
void recursion(static short &di);
using namespace std;
int main()
{
short pi = 1;
for(pi; pi > 0; pi++)
{
cout << "Hi, pi!" << "n";
recursion(pi);
}
}
void recursion(static short &di)
{
di++;
if(di < 20)
{
return;
}
else
{
cout << di << "n";    
}
}

出于某种原因,当16位容器不是静态的时,它可以正常工作,但我希望它是静态的,它会给出以下错误:

main.cpp:2:29:错误:存储类说明符在参数声明中无效void递归(静态短di);^main.cpp:2:29:错误:为参数"di"指定了存储类main.cpp:14:29:错误:存储类说明符在参数声明中无效void递归(静态短di)^main.cpp:14:29:错误:为参数"di"指定了存储类

不能为函数参数指定static存储持续时间。

您仍然可以将对static变量的引用传递给函数,该引用仍将引用static变量。

例如:

int main()
{
static short pi = 1;
// ^^^^^^
for(pi; pi > 0; pi++)
{
cout << "Hi, pi!" << "n";
recursion(pi);
}
// ...
}
void recursion(short &di)
{
// ...
}

但在您的案例中,将pi设为static似乎毫无意义。


您可能不完全理解static存储持续时间的含义,所以我可以自由解释。

通常,您声明的变量不带static限定符,如下所示:

void foo()
{
int myValue = 42;
}

像这样声明的变量具有自动存储持续时间;意思是当它"超出范围"时,对象就被破坏了。如果您拨打foo()100次:

int main()
{
for (int i = 0; i < 100; ++i)
foo();
}

则CCD_ 9将被重新初始化100次。通常这正是你想要的。

有时,您希望一个变量的寿命超过其声明的范围。为了实现这一点,您使用static关键字:为其提供静态存储持续时间

void foo()
{
static int myValue = 42;
}

以这种方式声明的变量在首次使用前将被精确地初始化一次,并且即使在超出范围后也将继续存在。它将保留它的值,直到它被重新分配,直到程序结束。


您的代码:

int main()
{
short pi = 1;
for(pi; pi > 0; pi++)
{
cout << "Hi, pi!" << "n";
recursion(pi);
}
}

建立pi变量,然后多次调用recursion。这里pi不需要静态存储持续时间,因为在调用recursion的循环中,它永远不会超出范围。您所要做的就是将对pi的引用传递给recursion,它将按照您的意愿进行操作。

错误消息非常明确;形式参数不能有static限定符;你需要申报

void recursion(short &di);

稍后定义

void recursion(short &di) {
di++;
if(di < 20)
return;
else
cout << di << "n";    
}