對於全局變量的警惕,尤其是如果你只想讓某些函數修改它們的話。
假設你不僅僅是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