首页 > 解决方案 > 具有单独的参数(对于函数)或参数结构有什么区别?

问题描述

我有文件压缩器/解压缩器的代码,我必须更改代码以使其并发。我有一个名为“worker”的函数,它从 in 队列中获取块,通过一个进程(压缩或解压缩)运行它们并将它们发送到 out 队列。

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

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

如果我在结构中有参数,这将是“工人”函数:

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 类型结构的指针有什么区别?

我应该期待有什么不同吗?我什么时候应该选择一种或另一种?

标签: cstruct

解决方案


在这种情况下,使用指向结构的指针的好处是,当您创建工作函数时,通常会使用函数指针。可以使用未指定参数编号和类型的参数创建指向函数的函数指针,但我不推荐这样做。

例如,如果我们看一下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;
}

类似的推理可以用于工作函数。

第三个原因可能是你有很多或论据要传递。然后它可以改用结构来提高可读性。


推荐阅读