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

Can I access static variables inside a function from outside

本文关键字:静态 变量 内部 从外部 访问 函数 我可以      更新时间:2023-10-16

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;
}

不行,C和c++都不行。

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

虽然它们有自己的用途,但大多数情况下,非常量静态局部变量是一个坏主意。它们使你的函数线程不安全,而且它们经常使它"只调用一次"。

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

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

#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;
}

不能,count变量只在函数内部可用,没有关联。然而,这个变量的生命周期将是文件的作用域,正如c++ Primer建议的

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

静态变量在块内有一个作用域,但是它的生存期贯穿整个程序,所以你不能尝试从函数返回一个指针来访问down变量

不,但是(很明显)你总是可以把它移到函数之外,这样整个文件都可以访问它;除了弄乱文件级的名称空间(在我看来这不是什么大问题),我不认为这样的移动有什么缺点(而且它也会更明确和明显:而不是访问一个被认为是私人的东西,你会清楚地表明这个东西是共享的)。

话虽这么说,所有类型的非常量静态数据都应该非常小心地使用,经验法则(即,除非证明不是这样)是一个坏主意。

在C和c++语言中,定义变量的作用域很重要。您无法从上层作用域访问变量。

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

不,静态变量的作用域被限制在定义它的块中,而它的生命周期是在进程之外的,所以当变量在函数中定义时,它将在调用该方法时存在,但是为了访问它,我们需要在函数作用域中。