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

问题描述 投票:0回答:2

这是全部来源:

#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”指定的存储类

c++ recursion
2个回答
8
投票

您无法为函数参数指定

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
,它就会按照您的预期运行。


0
投票

错误信息非常明确;正式论证不能有

static
限定词;你需要声明

  void recursion(short &di);

稍后定义

  void recursion(short &di) {
    di++;
    if(di < 20)
      return;
    else
      cout << di << "\n";    
  }
© www.soinside.com 2019 - 2024. All rights reserved.