有没有办法将函数的当前状态传递给C / C ++中的另一个函数?我的意思是当前状态的所有参数和局部变量。例如:
void funcA (int a, int b)
{
char c;
int d, e;
// Do something with the variables.
// ...
funcB();
// Do something more.
}
void funcB()
{
// funcB() should be able to access variables a,b,c,d & e
// and any change in these variables reflect into funcA().
}
如果需要funcB()
种功能,代码就会形成错误。但它可以实现吗?
如果有人开始使用多个参数对长方法进行重新分解,这可能会有所帮助。
答案 0 :(得分:7)
介绍一个常见的结构。
struct State {
char c;
int d,e;
};
void funcA(int a, int b){
State s;
s.d = 1234; // ...
// ...
funcB(s);
}
void funcB(State& s)
{
//...
}
答案 1 :(得分:5)
gcc支持类似于Pascal的扩展,即嵌套函数,例如
#include <stdio.h>
int main(void)
{
int a = 1, b = 2;
void foo(void)
{
printf("%s: a = %d, b = %d\n", __FUNCTION__, a, b);
}
printf("%s: a = %d, b = %d\n", __FUNCTION__, a, b);
foo();
return 0;
}
使用--nested-functions:
编译它$ gcc -Wall --nested-functions nested.c -o nested
然后运行它:
$./nested
main: a = 1, b = 2
foo: a = 1, b = 2
当然这是不可移植的,但是如果你只使用gcc并且你有太多遗留代码要重写,那么这可能是一个很好的解决方案。
答案 2 :(得分:3)
另一个可能比第一个更优雅。它使用带有静态成员的结构。
struct SomeAlgo {
SomeAlgo()
: c(0), d(0), e(0) // Initialize common variables
{ }
void funcA(int a,int b)
{
c = 1234; //...
// ...
funcB();
}
void funcB() // You may put it in the private section.
{
// Simply use c,d,e here.
}
private:
char c;
int d,e;
};
用法
SomeAlgo alg;
alg.funcA(3,4);
编辑:制造成员不是静态的。那样更好。
答案 3 :(得分:2)
创建一个结构来保存你关心的所有状态。
根据struct编写两个函数;也就是说,它们将结构的一个实例作为唯一参数,并且所有状态都保存在结构中。
struct foo { int d; int e; char c ; } fooinstance;
void afunc( struct foo fi);
void bfunc( struct foo fi);
void afunc( struct foo fi ) {
// do stuff with fi
f1.d += fi.e ;
fi.c++;
// call b
b(fi);
}
然后将结构实例从a传递给b。更高效的是将指针传递给结构,但传递结构将起作用。
答案 4 :(得分:1)
没有,原则上数据全部可用,它都在堆栈中,但C没有提供访问它们的机制,除非你开始使用内联汇编和指针等。不是你想要做的事情。最好只是通过你需要的东西。
答案 5 :(得分:1)
如果有人出发,这可能会有所帮助 重新考虑一个长方法 多个参数。
要击败这个特殊问题,您可以使用对象,并在构造函数中将一些常用的参数绑定到对象的成员。而不是使你的函数(接受这些长参数列表)成员函数。
答案 6 :(得分:1)
最好的解决方案是将变量放在结构中,并通过引用其他函数来传递此结构。 虽然,还有另一种解决方案,您可以使用宏。宏可以访问你在同一范围内的任何变量,但我不推荐这种方法。
答案 7 :(得分:0)
做这样的事情会破坏模块化和创建功能的整个目的。 funcB
只能由某些其他函数调用,特别是那些定义它所依赖的变量的函数。对于编写调用funcB
的新代码的人来说,这一点并不清楚。
正如其他人所建议的那样,我会为此目的创建一个结构,或者通过引用传递所有需要的变量,以明确funcB
所依赖的内容。
答案 8 :(得分:-3)
您可能想要做的是:将您的函数封装到类中并创建它的单例实例。您希望在这些函数之间共享的状态是OOP中通过实例化对象并在其上调用方法而在技术上发生的。
因此,如果C ++是一个选项(因为C没有OOP),我建议使用该解决方案。
另一种方法是使用lambdas / closures,但这不是C / C ++中的一个选项,因为它不支持这些语言结构。
修改:如果您知道如何在整个代码中正确处理这些单例,则只使用单例...