功能如何“记住”它的下一次使用结果?

时间:2015-02-22 18:02:03

标签: c function syntax

如何创建一个记住其返回结果的函数?

例如:

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是否适用于全局变量?

2 个答案:

答案 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。