我有一个小程序,其中 gtk 信号回调函数需要 2 或 3 个变量。
我不想创建这些全局变量(该项目的整个目标是整洁),并且我不想创建整个结构,以便我可以将小部件和编译的正则表达式发送到函数。
据我所见g_signal_connect
只允许单个数据变量。
最有效的方法可能是指向所讨论的两个对象的 void 指针数组?像这样的东西吗?
void * data[2];
data[0] = widget;
data[1] = compiledregex;
g_signal_connect(save,"clicked",G_CALLBACK(callbackfunction),data);
当然,您可以使用 void 指针数组,但是如果您想传递不同类型的值(尤其是类型长于sizeof(void *)
),不能使用数组。对于这些,您几乎肯定希望将它们包装在一个结构中,并将结构的地址作为数据参数传递。
Example:
struct my_struct *data = malloc(sizeof(*data));
data->field_one = value_one;
data->field_two = value_two; /* etc. */
g_signal_connect(save, "clicked", callback, data);
当然,别忘了free(data)
在回调函数中(假设它是一次性使用的)。
编辑:正如您想要一个带有 void ** 的示例,这里是(这很丑陋,我不建议您使用它 - 要么因为为原始类型分配单元素数组会浪费您的拍摄,要么因为转换指向 void * 的非指针是不好的做法...):
void **data = malloc(sizeof(data[0]) * n_elements);
type1 *element1_ptr = malloc(sizeof(first_item));
*element1_ptr = first_item;
data[0] = element1_ptr;
/* etc. */
释放他们:
int i;
for (i = 0; i < n_elements; i++)
free(data[i]);
free(data);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)