一个函数如何 "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.
我怎样才能让函数记住它的返回结果?
例如:
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.