对于全局变量的警惕,尤其是如果你只想让某些函数修改它们的话。
假设你不仅仅是A
(为简单起见,我定义为int
),你可以设置你的结构,包括其他数据成员在必要时熟悉的方式
typedef struct t_MYCBSD
{
int A;
// other members
} MYCBSD; // callback struct data
保留更多的数据。 (如果有一些自引用,我已经包含了t_MYCBSD
)。
然后你可以实现你的回调函数如下:
void callback_func1(GtkWidget *widget, gpointer user_data)
{
MYCBSD *data = user_data;
data->A = some_func();
}
void callback_func2(GtkWidget *widget, gpointer user_data)
{
MYCBSD *data = user_data;
data->A = another_func();
}
void callback_func3(GtkWidget *widget, gpointer user_data)
{
MYCBSD *data = user_data;
if(data->A > threshold) do_something();
else do_nothing();
}
显然,some_func()
,another_func()
,threshold
,do_something()
和do_nothing()
是在这方面有效。
注意:data
指向您的结构的指针使语法更清晰一点。您还可以使用:
((MYCBSD *) user_data)->A = some_func();
无论如何,您通常在创建小部件时设置回调。在以下(严重剔除,非GtkBuilder)代码中,MYCBSD mydata
将在本地范围内。我假设回调将设置为“点击”事件的一些按钮。
int main(int argc, char* argv[])
{
MYCBSD mydata;
// Below-referenced widgets
GtkWidget *mywidget1, *mywidget2, *mywidget3;
// ... other widgets and variables
mydata.A = 0; // Optionally set an initial value to A
// Standard init via gtk_init(&argc, &argv);
// ... Create the toplevel and a container of some kind
// Create mywidget1,2,3 (as buttons, for example)
mywidget1 = gtk_button_new_with_label ("widget1");
mywidget2 = gtk_button_new_with_label ("widget2");
mywidget1 = gtk_button_new_with_label ("widget3");
g_signal_connect(mywidget1, "clicked", G_CALLBACK(callback_func1), &mydata);
g_signal_connect(mywidget2, "clicked", G_CALLBACK(callback_func2), &mydata);
g_signal_connect(mywidget3, "clicked", G_CALLBACK(callback_func3), &mydata);
// ... Attach those widgets to container
// ... and show all
// Run the app in a standard way via gtk_main();
return 0;
}
最重要的这里行是:
g_signal_connect(mywidget1, "clicked", G_CALLBACK(callback_func1), &mydata);
g_signal_connect(mywidget2, "clicked", G_CALLBACK(callback_func2), &mydata);
g_signal_connect(mywidget3, "clicked", G_CALLBACK(callback_func3), &mydata);
其中最后一个参数传递数据的回调函数。
如果你只是想分享一个值,A
,你可以以类似的方式传递它,而不需要结构。
嘿,我一直在使用这些结构来在回调之间共享Gtk Widgets,我不认为它也是共享标志和变量的最简单方法。现在很清楚! – 2014-10-15 18:29:12