如何创建一个记住其返回结果的函数?
例如:
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
是否适用于全局变量?
答案 0 :(得分:3)
这就是C中的static
关键字的含义。 有点儿!请注意,请参阅下面的修改。
具有static
存储类的变量将在程序的生命周期中存在,而不仅仅是在声明范围的末尾:
int foo()
{
static int counter = 0;
counter ++;
return counter;
}
将在连续的呼叫中返回1,2,3...
。
编辑:评论员似乎同意,如果您正在进行同意访问(即多线程),static
是危险的,这是明智的,我同意这一点。但话又说回来,你已经意识到全局变量可能是有害的,所以这可能不是新的,考虑到你的问题的性质,你可能不会在你的编程工具中找到你想要的地方。做多线程;如果您正在做,请参考介绍多线程的任何内容,以便安全地修改共享状态(信号量/互斥量......)。
EDIT2:它当然不仅在多线程环境中是危险的;例如,当两个不同的函数在内部调用foo
并期望看到自己的1,2,3...
序列时,事情就会出错。请特别小心使用。
EDIT3:第三,虽然@sashoalm的答案是正确的,并且最符合您问题的标题。 static
更适用于不可变的,一次性可初始化的状态,而不是几乎在任何环境中都可能爆炸的可修改的事物。所以我在这里引用最重要的一行of the best answer,因为你已经决定接受我的回答,这可能误导后来的读者:
所以最正确的答案是否定的,你不能在C中做到这一点,不,静态不是答案。
答案 1 :(得分:2)
我正在回答你的标题,即“功能如何”记住“它的下一次使用的结果?”。你的标题意味着一般情况,我对你的问题体中的特定功能不感兴趣。
首先,我想对yield
关键字的Python表示赞赏,不幸的是,在C中没有这样的语法糖。
所以最正确的答案是不,你不能在C中做到这一点,不,静态不是答案。
静态不可重入。有时一个简单的不,你不能这样做,不是真的,不是在C,比告诉你半生不熟的解决方案更好。 C只是没有这个功能,就是这样。
Python有yield
,C没有。结束。
您必须使用结构来保存状态来模拟它。
一些伪代码:
struct State { ... };
Output foo(struct State *state, ...) { ... }
...
foo(&state);
foo(&state);
如果您不想以正确的方式执行此操作,请使用static并在尝试嵌套对函数的调用时花费2-3天来计算错误。 strtok
以这种方式咬人。
注意使用static
可能会使功能不可重入。小心:
Output foo(...) { static struct State state; ... }
数学意义上的函数根据定义是无状态的。如果它有状态,那么它是一个对象,而不是一个函数。具有静态的函数语义实际上是单个对象。
State意味着内存,而memory + methods = object。