c - 具有单独的参数(对于函数)或参数结构有什么区别?
问题描述
我有文件压缩器/解压缩器的代码,我必须更改代码以使其并发。我有一个名为“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 类型结构的指针有什么区别?
我应该期待有什么不同吗?我什么时候应该选择一种或另一种?
解决方案
在这种情况下,使用指向结构的指针的好处是,当您创建工作函数时,通常会使用函数指针。可以使用未指定参数编号和类型的参数创建指向函数的函数指针,但我不推荐这样做。
例如,如果我们看一下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;
}
类似的推理可以用于工作函数。
第三个原因可能是你有很多或论据要传递。然后它可以改用结构来提高可读性。
推荐阅读
- javascript - 未捕获的类型错误:$(...).datagrid 不是函数
- python - Pycharm IDE中OpenCV中的“未指定错误。功能未实现”错误
- javascript - Phantom JS 和组件
- c# - 想要直接从对象访问类属性(字段)
- mpi - 带 Mpi 的 2D Radom Walk
- css - 如何在 asp.net 网站上正确定位谷歌地图?
- css - Tornadofx CSS 选定行
- facebook - Facebook 应用审查页面公共内容访问
- angular - 量角器登录问题
- android - 错误:(40, 13) 无法解决:“com.android.support:recyclerview-v7:26.0.0-beta1”