缺點與使用任何全局變量的缺點相同。 This page對不應使用全局變量(以及何時使用)的情況有很好的概述。如果你看起來接近底部,你會在「真正糟糕的原因使用全局變量」下看到:
我不想一直傳遞它。
恐怕這就是你反對的聲音。但是,正如我鏈接到的頁面也提到的那樣,如果您只是編寫簡短或一次性程序,那麼使用全局變量的難易可能超過了缺點。
大中型項目通常的方法是創建一個結構和main()
填充它,並把它傳遞給回調:
typedef struct {
GtkWidget *window, *button, *textfield;
} Widgets;
int main(int argc, char **argv) {
gtk_init(&argc, &argv);
Widgets *w = g_slice_new0(Widgets);
w->window = gtk_window_new(... etc...
...
g_signal_connect(w->button, "clicked", G_CALLBACK(on_clicked), w);
...etc...
gtk_main();
g_slice_free(Widgets, w);
return 0;
}
在大型程序,更好的方法是創建自己的類代表主窗口,首選項對話框等,並將這些類傳遞給各種回調。
謝謝你的迴應!我想在一天結束的時候,讓雙方都開心的最簡單的方法就是,就像你所說的那樣,從一開始就把每一個小部件放在一個大結構中,然後每次都傳遞它。 (雖然,如果我需要小部件和信號處理程序ID,該怎麼辦?似乎小部件總是會阻止'gpointer userdata') – Ancurio
沒有什麼能夠阻止您在結構中放置信號處理程序ID。 – ptomato
是的..猜你是對的 – Ancurio