我可以从外部访问函数内的静态变量吗?

时间:2015-06-04 05:54:27

标签: c++ c

C / C ++:我可以从外部访问函数内的静态变量吗?例如:

#include <iostream>
using namespace std;

void f()
{
    static int count = 3;
    cout << count << endl;
}

int main(int argc, char** argv)
{
    f::count = 5;   // apparently this is an invalid syntax.
    f();

    return 0;
}

8 个答案:

答案 0 :(得分:12)

不,你不能,无论是C还是C ++。

如果要维护与函数关联的状态,请定义具有适当状态和成员函数的类。 (在C ++中。你也用C标记了这个问题;同样的技术有效但你需要自己完成所有的基础工作。)

尽管它们有它们的用途,但大多数时候非常静态本地人都是个坏主意。它们使你的函数线程不安全,并且它们经常使它成为“一次调用”。

答案 1 :(得分:6)

函数作用域内的变量不能通过名称外部访问,但可以返回指针或引用

答案 2 :(得分:1)

不,变量计数仅在函数内可用且没有链接。但是,这个变量的生命周期将是文件的范围,正如C ++ Primer建议的那样

  

在第一次执行通过对象的定义之前,初始化每个本地静态变量。当函数结束时,不会破坏局部静态;程序终止时它们会被销毁。

答案 3 :(得分:1)

正如在其他答案中所说的那样,在外部访问局部变量没有特殊的语法,但你可以通过返回对变量的引用来实现这一点,例如:

#include <iostream>
using namespace std;
int& f(void)
{
     static int count = 3;
     cout << count << endl;

     return count;
}

int main()
{
    int &count = f(); // prints 3
    count = 5;
    f();              // prints 5
    return 0;
}

在C ++ 11中,您还可以从返回的lambda中访问本地静态变量:

#include <iostream>
#include <functional>

using namespace std;

std::function<void()> fl()
{
    static int count = 3;
    cout << count << endl;

    return []{count=5;};
}

int main()
{
    auto l = fl();  // prints 3
    l();
    fl();           // prints 5
    return 0;
}

答案 4 :(得分:0)

静态变量在块中有一个范围,但它在整个程序中都有一个生命周期,因此你无法访问coun tvariable尝试从函数返回一个指针。

答案 5 :(得分:0)

不,但(显然)你总是可以将它移到函数之外,这样它就可以被整个文件访问;除了杂乱的文件级名称空间(这是恕我直言并不是什么大不了)之外,我没有看到这样一个举动有太多的缺点(而且它也会更加明确和明显:而不是访问一个所谓的私人事情,你明确表示要分享这件事。)

话虽这么说,各种非常数静态数据应该非常谨慎地使用,并且经验法则(即直到另有证明),这是他们的坏主意。

答案 6 :(得分:0)

在C和C ++语言中,定义变量的范围很重要。你无法从高端范围到达变量。

为此,您可以使用结构或C ++类并将这些数据保存在对象中。

答案 7 :(得分:0)

没有, 静态变量的范围仅限于定义它的块,而它的生命周期虽然在整个过程之外,所以当函数定义变量时,一旦调用此方法它就会存在但是为了访问它我们需要在功能范围。