拥有单独的参数(用于函数)或参数结构有什么区别?

时间:2019-05-19 12:52:17

标签: c struct

我有文件压缩器/解压缩器的代码,并且我必须更改代码以使其并发。我有一个称为“工作者”的函数,该函数从入队队列中获取大块,通过进程(压缩或解压缩)运行它们,然后将其发送到出队队列。

这是'worker'函数头(带有单独的参数):

void worker(queue in, queue out, chunk (*process)(chunk));

如果我在struct中有参数,这将是'worker'函数:

void worker(void *ptr) {
    chunk ch, res;
    struct args *args = ptr;
    while(q_elements(args->in) > 0) {
        ch = q_remove(args->in);

        res = args->process(ch);
        free_chunk(ch);

        q_insert(args->out, res);
    }
}

和结构:

struct args {
    int thread_num;
    queue in;
    queue out;
    chunk (*process) (chunk);
};

现在,我的问题是:传递单独的参数或指向args类型的结构的指针有什么区别?

我应该期待有什么不同吗?我什么时候应该选择一个选项?

1 个答案:

答案 0 :(得分:1)

在这种情况下,具有指向结构的指针的好处是,在创建辅助函数时,通常会使用函数指针。可以为带有未指定参数编号和类型的参数的函数创建函数指针,但我不建议这样做。

例如,如果我们看看pthread_create,它的原型是:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

在这里,start_routine是辅助函数,arg是传递给它的参数。如果没有这种方法,创建一个易于使用的框架几乎是不可能的。

  

传递单独的参数或指向args类型的结构的指针有什么区别?我应该期待有什么不同吗?我什么时候应该选择一个选项?

如上例所示,如果要使用pthread,只需使用结构即可。

另一种用法是,如果您想隐藏程序员的实现细节。它有点像OOP。考虑使用此标头:

// foobar.h
struct data;
int getId(struct data *data);
void setId(struct data *data, int id);

现在,由于某种原因,您不希望程序员直接访问data中的字段。因此我们将其实现隐藏在源文件中:

// foobar.c
struct data {
    int id;
    // More fields
}

int getId(struct data *data) {
    return data->id;
}

void setID(struct data *data, int id) {
    data->id = id;
}

类似的推理可以用于辅助函数。

第三个原因可能是您有要传递的LOTS或参数。然后可以改用结构来提高可读性。