将函数的当前状态传递给C / C ++中的另一个函数

时间:2010-02-04 13:32:12

标签: c++ c function calling-convention

有没有办法将函数的当前状态传递给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()种功能,代码就会形成错误。但它可以实现吗?

如果有人开始使用多个参数对长方法进行重新分解,这可能会有所帮助。

9 个答案:

答案 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 ++中的一个选项,因为它不支持这些语言结构。

修改:如果您知道如何在整个代码中正确处理这些单例,则只使用单例...