一个函数如何 "remember" 它是下一次使用的结果?

How can a function "remember" it's result for its next use?

我怎样才能让函数记住它的返回结果?

例如:

char * foo(char * str1, char * str2){
   ...
   return bar;
}

int main(){
  ...
  foo(a,b);   //returns a string
  foo(NULL,c);//will use the returned above string in the NULL parameter
}

这与 strtok 的工作方式类似。

我想全局变量可以工作,但据我所知这不是好的做法,还有其他方法吗? strtok 是否适用于全局变量?

这就是 C 中的 static 关键字的用途。 有点!请注意,请参阅下面的编辑。

具有 static 存储 class 的变量将在程序的整个生命周期内存在,而不仅仅是声明范围的末尾:

int foo()
{
    static int counter = 0;
    counter ++;
    return counter;
}

将 return 1,2,3... 连续调用。

编辑:评论员似乎同意警告您 static 是危险的,如果您正在进行并发访问(即 multi-threading),我同意这一点。但是话又说回来,您已经意识到全局变量可能是有害的,所以这可能不是什么新鲜事,并且考虑到您问题的性质,您可能不在您的编程生涯中正在做的事情 multi-threading;如果你正在做,请参考任何向你介绍 multi-threading 的内容,以了解修改共享状态的安全方法 (semaphores/mutexes...)。

EDIT2:这当然不仅在 multi-threading 环境中是危险的;例如,当两个不同的函数在内部调用 foo,并期望看到它们自己的 1,2,3... 序列时,事情就会出错。请格外小心使用。

EDIT3:第三,@sashoalm 的答案是正确的,最适合您的问题标题。 static 更适用于不可变的、one-time 可初始化的状态,而不是指可以在几乎任何环境中起火的可修改事物。所以在这里我引用最重要的一行of the best answer,因为你已经决定接受我的回答,这可能会误导后来的读者:

So the most correct answer is NO, you cannot do that in C, and no, static is not the answer.

我在回答你的标题,是"How can a function “remember” it's result for its next use?"。你的标题暗示了一般情况,我对你问题中的特定功能不感兴趣body。

首先,我想为 yield 关键字向 Python 表示敬意,不幸的是,在 C 中没有这样的语法糖。

所以最正确的答案是不,你不能在 C 中这样做,不,静态不是答案

静态不可重入。有时一个简单的不,你不能那样做,不是真的,不是在 C 中,比告诉你 half-baked 解决方案更好。 C就是没有这个特性,仅此而已。

Python 有 yield,C 没有。结束.

您必须通过使用结构来保存状态来模拟它。

一些 pseudo-code:

struct State { ... };
Output foo(struct State *state, ...) { ... }

...

foo(&state);
foo(&state);

如果您不想以正确的方式进行操作,那么在您尝试嵌套对函数的调用时,请使用 static 并花 2-3 天的时间找出错误。 strtok 就这样咬过人。

注意使用static可能会使函数不可重入。注意:

Output foo(...) { static struct State state; ... }

附录

根据定义,数学意义上的函数是无状态的。如果它有状态,那么它就是一个 object,而不是一个函数。具有静态的函数在语义上实际上是一个单例object。

状态隐含内存,内存+方法=object.