Недостатки такие же, как и недостатки использования любой глобальной переменной. Эта страница содержит хороший обзор ситуаций, когда вам не следует (и когда вам следует) использовать глобальные переменные. Если вы посмотрите внизу, вы увидите «Неправильные причины для использования глобальных переменных»:
Я не хочу все время обмениваться.
Боюсь, это то, на что похоже ваше возражение. Однако, как упоминается на странице, на которую я ссылался, если вы просто пишете короткие или одноразовые программы, то простота использования глобальных переменных, вероятно, перевешивает недостатки.
Обычный способ в программах среднего размера - создать структуру и заполнить ее в 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;
}
В больших программах лучшим способом является создание собственных классов, представляющих основные окна, диалоговые окна предпочтений и т. Д., И передача этих классов различным обратным вызовам.