3

有没有办法将函数的当前状态传递给 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()如果需要某种功能,则代码状态不佳。但能实现吗?

如果有人开始重构具有多个参数的长方法,这会有所帮助。

4

9 回答 9

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)
{
    //...
}
于 2010-02-04T13:36:36.547 回答
5

gcc 支持对 C 的类似 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 并且你有太多遗留代码需要重写,那么这可能是一个很好的解决方案。

于 2010-02-04T14:13:05.217 回答
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);

编辑:使成员不是静态的。那样更好。

于 2010-02-04T14:14:34.807 回答
2

创建一个结构来保存您关心的所有状态。

根据结构写出这两个函数;也就是说,它们将结构的实例作为唯一的参数,并且所有状态都保存在结构中。

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。更有效的方法是将指针传递给结构,但传递结构将起作用。

于 2010-02-04T13:35:53.133 回答
1

不,没有,原则上数据都是可用的,都在堆栈上,但是 C 没有提供访问它们的机制,除非你开始使用内联汇编和指针等。不是你想做的事情。最好只传递你需要的东西。

于 2010-02-04T13:35:08.753 回答
1

如果有人开始重构具有多个参数的长方法,这会有所帮助。

为了解决这个特殊问题,您可以使用对象并在构造函数中将一些常用参数绑定到对象的成员。而不是让你的函数(接受这些长长的参数列表)成为成员函数。

于 2010-02-04T13:37:44.737 回答
1

最好的解决方案是将变量放在一个结构中,并通过引用其他函数来传递这个结构。不过,还有另一种解决方案可以使用宏。宏可以访问同一范围内的任何变量,但我不推荐这种方法。

于 2010-02-04T13:48:12.070 回答
0

做这样的事情会破坏模块化和创建函数的整个目的。funcB只能由某些其他函数调用,特别是那些定义它所依赖的变量的函数。这对于编写新代码调用的人来说根本不清楚funcB

正如其他人所建议的那样,我要么为此目的创建一个结构,要么通过引用传递所有需要的变量以明确funcB依赖于什么。

于 2010-02-04T13:40:18.117 回答
-3

您可能想要做的是:将您的函数封装到一个类中并创建它的单例实例。您希望在这些函数之间共享的状态是在 OOP 中通过实例化对象并在它们上调用方法在技术上发生的情况。

因此,如果 C++ 是一个选项(因为 C 没有 OOP),我会建议使用该解决方案。

另一种方法是使用 lambdas/closures,但这不是 C/C++ 中的选项,因为它不支持这些语言结构。

编辑:如果您知道如何在整个代码中正确处理这些,请仅使用单例...

于 2010-02-04T14:20:43.330 回答