在静态数组中调用gtk_accelerator_name时,如何避免“初始化元素不是常量”?

时间:2012-01-02 15:57:53

标签: c gtk constants

我改变了这个:

static GtkActionEntry menu_items[] = {
  { "OpenFile", GTK_STOCK_OPEN, NULL, "<control>O", NULL, G_CALLBACK(file_open) },
  ...
},

......对此:

static GtkActionEntry menu_items[] = {
  { "OpenFile", GTK_STOCK_OPEN, NULL, gtk_accelerator_name(GDK_o, GDK_CONTROL_MASK), NULL, G_CALLBACK(file_open) }, 
  ...
},

...现在我得到“错误:初始化元素不是常数”。我需要做些什么改变才能实现这个目标?

GtkActionEntry的第四个参数是一个gchar指针,gtk_accelerator_name返回到我能看到的地方。

menu_items用于静态函数,如下所示:

static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);

static GtkWidget *get_menubar_menu(GtkWidget *win) {
  GtkActionGroup *action_group = gtk_action_group_new("Menu");
  gtk_action_group_add_actions(action_group, menu_items, nmenu_items, 0);
  ...
}

1 个答案:

答案 0 :(得分:2)

您不能这样做,static数据需要在编译时确定,但gtk_accelerator_name()可能驻留在编译时可能甚至不可用的共享对象中。

因此,您需要在启动时添加代码以通过数组,然后在调用gtk_action_group_add_actions()时实际使用它,并根据需要将每个字符串传递给gtk_accelerator_name()