这是全部来源:
#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:错误:参数声明中的存储类说明符无效 无效递归(静态短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();
}
...然后
myValue
将被重新初始化 100 次。通常这正是您想要的。
有时您希望变量的生存期超过其声明的范围。为了实现这一点,您可以使用 static
关键字为其指定
static存储持续时间:
void foo()
{
static int myValue = 42;
}
以这种方式声明的变量将在首次使用之前准确初始化once,并且即使在超出范围后也将继续存在。它将保留其值,直到被重新分配,直到程序结束。
您的代码:
int main()
{
short pi = 1;
for(pi; pi > 0; pi++)
{
cout << "Hi, pi!" << "\n";
recursion(pi);
}
}
建立
pi
变量,然后多次调用recursion
。这里 pi
not 不需要静态存储持续时间,因为在调用 recursion
的循环期间它永远不会超出范围。您所要做的就是将对 pi
的引用传递给 recursion
,它就会按照您的预期运行。
错误信息非常明确;正式论证不能有
static
限定词;你需要声明
void recursion(short &di);
稍后定义
void recursion(short &di) {
di++;
if(di < 20)
return;
else
cout << di << "\n";
}