我可以从外部访问函数内部的静态变量吗?
Can I access static variables inside a function from outside
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++类并将这些数据保存在对象中。
不,静态变量的作用域被限制在定义它的块中,而它的生命周期是在进程之外的,所以当变量在函数中定义时,它将在调用该方法时存在,但是为了访问它,我们需要在函数作用域中。
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 复制文件流C++静态变量
- 跨模板化函数编译的静态变量
- C++编译器是否优化了顺序静态变量读取?
- C++,每个循环初始化一个新的静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 程序如何知道静态变量是否需要初始化?
- 类外的静态变量实例化
- 无法解析静态变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- 访问从 CPP 文件到其他头文件的静态变量