【问题标题】:Share variables internally across functions在函数内部共享变量
【发布时间】:2014-12-24 10:48:19
【问题描述】:

假设我有这样的功能:

static int init_processing(char *buf, FILE *stream, enum operationMode mode) {
    /* save index of `stream' in current operations */
    /* start processing */
    /* save some important variables for continue_processing */
    off_t position;
    enum operationMode _mode;
    return num_processing_operations_left;
}

.. 我偶尔会打电话。我还有另一个函数可以执行我想要的实际处理:

static int continue_processing(FILE *stream) {
    /* lookup the index of `stream' in current operations */
    /* do some stuff */
    /* save some static variables */
    static off_t left = position;
    static void *some_ptr;
    return --num_processing_operations_left;
}

我还有一个清理函数可以在完成某个操作时调用:

static int end_processing(FILE *stream) {
    /* check */
    if (num_processing_operations_left)
        return 1;
    /* clean everything */
    return 0;
}

如您所见,这种相关函数技术非常熟悉,它被标准库本身使用(例如 [mallocfreerealloc]、[fdopenfopenfclose])。

我想在这里实现的是如何在一堆函数之间共享一些变量?
我想到了两个解决方案:

  • 将每组函数放在自己的文件中,提供仅对文件本身有效的静态变量。

  • 仅使用一个将额外枚举参数作为模式的函数并相应地构造函数。

但这些解决方案实际上并不是解决方案,它们只是解决问题的变通方法。那么,是否有任何标准技术可以在函数之间共享变量?

【问题讨论】:

    标签: c architecture functional-programming scope


    【解决方案1】:

    创建一个满足你需要的上下文结构:

    struct Context
    {
      FILE * stream;
      off_t position;
      unsigned num_processing_operations_left;
      /* define some more important variables */
    }
    

    并将其传递给所有有问题的函数:

    static int init_processing(struct Context * pctx, char *buf, enum operationMode mode);
    static int continue_processing(struct Context * pctx);
    static int end_processing(struct Context * pctx);
    
    int main(void)
    {
      struct Context ctx = {0};
    
      /* init ctx here */
    
      int result = init_processing(&ctx, ...);
    
      ...
    
      result = continue_processing(&ctx);
    
      ...
    
      result = end_processing(&ctx);
    
      ...
    }
    

    【讨论】:

    • 这似乎是一个合理的解决方案。有没有已知的使用这种风格的库?
    • 缓冲文件 I/O API(fopen()fread()fwrite()fclose() 和朋友)正是使用这种方法。使用的“上下文”结构是FILE。 @AmrAyman
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2015-12-12
    • 2011-11-01
    • 2011-03-24
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多