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