错误:不应忽略 void 值 - C/GTK+

Posted

技术标签:

【中文标题】错误:不应忽略 void 值 - C/GTK+【英文标题】:error: void value not ignored as it ought to be - C/GTK+ 【发布时间】:2011-04-22 06:20:21 【问题描述】:

我正在尝试在 GTK+ 中创建一个具有如下标签的窗口:

每当用户单击“新建”按钮时,都会出现一个新选项卡。

然而,当我编译我的程序时,我得到了一个错误:void value not ignored as it hould be

phongcao@phongcao:~$ g++ /home/phongcao/C++/GTK+/newtab.cc -o /home/phongcao/C++/GTK+/newtab `pkg-config gtk+-2.0 --cflags --libs`
/home/phongcao/C++/GTK+/newtab.cc: In function ‘int main(int, char**)’:
/home/phongcao/C++/GTK+/newtab.cc:51:3: error: void value not ignored as it ought to be

这里是代码:

#include <gtk/gtk.h>

void destroy(GtkWidget *window, gpointer data) 
  gtk_main_quit();


void new_tab(GtkNotebook *notebook, GtkWidget *content, GtkWidget *hbox) 
  gtk_notebook_append_page(notebook, content, hbox);


int main(int argc, char *argv[]) 

  GtkWidget *window, *label, *content;
  GtkWidget *button, *hbox, *notebook;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  gtk_window_set_title(GTK_WINDOW(window), "New Tab");
  gtk_widget_set_size_request(window, 300, 200);

  notebook = gtk_notebook_new();

  button = gtk_button_new_with_label("New");
  label = gtk_label_new("Tab");
  hbox = gtk_hbox_new(FALSE, 5);
  content = gtk_label_new("This is a tab");
  gint a = 0;

  gtk_box_pack_start_defaults(GTK_BOX(hbox), label);
  gtk_box_pack_start_defaults(GTK_BOX(hbox), button);

  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), content, hbox);
  gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);

  //This following line is where the error is from:
  g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), NULL); 

  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

  gtk_container_add(GTK_CONTAINER(window), notebook);

  gtk_widget_show_all(hbox); 
  gtk_widget_show_all(window);

  gtk_main();
  return 0;

感谢您的帮助!!我真的很感激!

【问题讨论】:

您似乎尝试使用 void 函数的返回值。我数不到 53,所以不能说在哪一行。 你能在编译器抱怨的那一行添加注释吗?您的示例只有 48 行 :) 我已经在发生错误的那一行添加了注释...对不起各位!! 【参考方案1】:

行号对我来说没有多大意义,但我认为您的问题就在这里(出于说明目的重新格式化):

g_signal_connect(G_OBJECT(button), "new_tab",
    G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), /* <== Badness */
    NULL
);

您在 G_CALLBACK 宏内调用 new_tab 函数。 new_tab 函数返回 void (即没有返回值),但它是在需要一个值的上下文中调用的,因此会出现“无效值未被忽略”错误。我想你的意思更像是这样说的:

g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab), NULL);

【讨论】:

hmm 但是如果我没有将任何参数传递给 new_tab 函数,如何让“新建”按钮打开一个新选项卡...您知道解决此问题的任何其他方法吗?谢谢你的回答很好! 您给g_signal_connect 一个指向函数的指针,它会在需要时调用该函数。这个GTK_NOTEBOOK(notebook) 演员表将进入您的new_tab() 函数,您可以使用g_signal_connect() 的第四个参数将额外数据传递给您的函数。第四个参数是 AFAIK,作为第二个参数传递给您的函数,有关如何调用回调的示例,请参阅您的 destroy() 函数。您应该能够在需要时查找您的两个 GtkWidget*,而不是到处传递它们。 @phngcv:最好的办法是问另一个问题,详细说明您尝试了什么以及出了什么问题。我们在这里为您提供帮助,而不是为您编写软件。现在已经很晚了,我该睡觉了。【参考方案2】:
g_signal_connect(G_OBJECT(button), "new_tab", G_CALLBACK(new_tab(GTK_NOTEBOOK(notebook), content, hbox)), NULL);

您确定要将参数传递给 new_tab() 吗?简单地说G_CALLBACK(new_tab)。这将解决错误。

如果你想调用“new_tab”,那么你必须在适当的地方显式调用函数(比如在传递给G_CALLBACK之前)。

您的查询可以参考这个small tutorial。

【讨论】:

嗯,如果我不将参数传递给新选项卡,那么单击“新建”按钮将不会打开新选项卡。顺便问一下,你知道解决这个问题的其他方法吗? (用可以打开新标签的新按钮创建一个窗口)我不知道我的是否已经是最佳的... 当您将函数名称作为参数传递时,您不能将参数传递给函数名称。此外,您可以看到您对Destroy 没有做同样的事情。您可以尝试从new_tab 中删除参数并查看吗? 哦,我确实从 new_tab 中删除了参数,但是当我点击“新建”按钮时,没有出现新标签...对于这个新标签问题,您有其他解决方案吗? 顺便问一下,你知道如何将多个参数传递给 g_signal_connect G_CALLBACK 函数吗?我可以在最后一个参数而不是 NULL 中添加其他数据吗? 我在答案中放了一个教程链接。如果对您有帮助,请参考。

以上是关于错误:不应忽略 void 值 - C/GTK+的主要内容,如果未能解决你的问题,请参考以下文章

编译错误“无法忽略空值,因为它应该是”在C编程中[重复]

如何使用 System.Text.Json 忽略错误值

无法将类型“(UIViewController?,NSError?)-> Void”的值分配给类型“((UIViewController?,错误?)-> Void)?”

TypeORM 在批量保存时抛出重复错误,而不是忽略或更新现有值

错误:无法将类型“(_)->()”的值转换为预期的参数类型“(()-> Void)?”

void值未如预期地被忽略