#include 的无限循环阻止了代码的构建
Infinite loop of #include prevents build of code
我正在使用 c 和 gtk + 3 创建一个 GUI。我不知道这是否是正确的方法,但是当我想清除 window 并构建我的应用程序的另一个页面时,我把所有东西都放在一个盒子里,当“新页面”功能是叫。我创建了一个菜单,用于我的应用程序的功能,一卷骰子,我想要一个按钮从该页面返回到菜单谁角色骰子,但我的程序我不能,因为这会创建一个无限#include 循环,这是我的代码:
“主页”:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <gmodule.h>
#include "De.h"
void HomePage(GSList *lAbsolute)
{
GtkWidget *pWindow;
GtkWidget *pBoiteTotal;
GtkWidget *pBoiteHome;
GtkWidget *pDeBtn;
GtkWidget *pFicheBtn;
pWindow = (GtkWidget*) g_slist_nth_data(lAbsolute, 0);
pBoiteTotal = (GtkWidget*) g_slist_nth_data(lAbsolute, 1);
gtk_widget_destroy (pBoiteTotal);
pBoiteHome = gtk_box_new(GTK_ORIENTATION_VERTICAL, 50);
gtk_container_add(GTK_CONTAINER(pWindow), pBoiteHome);
lAbsolute = g_slist_append(lAbsolute,(GtkWidget*) pBoiteHome);
pDeBtn = gtk_button_new_with_label ("Lancer de de");
gtk_box_pack_start(GTK_BOX(pBoiteHome), pDeBtn, TRUE, TRUE, 0);
pFicheBtn = gtk_button_new_with_label ("Fiche des joueurs");
gtk_box_pack_start(GTK_BOX(pBoiteHome), pFicheBtn, TRUE, TRUE, 0);
gtk_widget_show_all(pWindow);
g_signal_connect(G_OBJECT(pDeBtn), "clicked", G_CALLBACK(Draw), lAbsolute);
}
家 page.h :
#include "homepage.c"
void HomePage(GSList *lAbsolute)
De.c中的Draw函数(我禁用了ReturnHomePage函数来停止循环)
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <gmodule.h>
#include "Lancer.h"
//#include "ReturnHomePage.h"
void Draw(GtkWidget *pDrawBtn, GSList *lAbsolute)
{
GtkWidget *pWindow;
GtkWidget *pImage;
GtkWidget *pBoiteHome;
GtkWidget *pBoiteDe;
GtkWidget *pBoiteReturnBtn;
GtkWidget *pReturnBtn;
GtkWidget *pImageReturnBtn;
pWindow = (GtkWidget*) g_slist_nth_data(lAbsolute, 0);
pBoiteHome = (GtkWidget*) g_slist_nth_data(lAbsolute, 6);
gtk_widget_destroy (pBoiteHome);
pBoiteDe = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(pWindow), pBoiteDe);
pBoiteReturnBtn = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add(GTK_CONTAINER(pBoiteDe), pBoiteReturnBtn);
pImageReturnBtn = gtk_image_new();
gtk_image_set_from_file(GTK_IMAGE(pImageReturnBtn), "img/btn/returnbtn.png");
pReturnBtn = gtk_button_new_with_label(NULL);
gtk_button_set_image(GTK_BUTTON(pReturnBtn), pImageReturnBtn);
gtk_box_pack_start(GTK_BOX(pBoiteReturnBtn), pReturnBtn, FALSE, FALSE, 0);
pImage = gtk_image_new();
gtk_box_pack_start(GTK_BOX(pBoiteDe), pImage, TRUE, FALSE, 0);
pDrawBtn = gtk_button_new_with_label("Lancer");
gtk_box_pack_start(GTK_BOX(pBoiteDe), pDrawBtn, TRUE, FALSE, 0);
gtk_widget_show_all(pWindow);
g_signal_connect(G_OBJECT(pDrawBtn), "clicked", G_CALLBACK(Lancer),(GtkWidget*) pImage);
//g_signal_connect(G_OBJECT(pReturnBtn), "clicked", G_CALLBACK(ReturnHomePage), lAbsolute);
}
De.h :
#include "De.c"
void Draw(GtkWidget *pDrawBtn, GSList *lAbsolute);
而 returnhomepage.c 是 .h
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <gmodule.h>
#include "HomePage.h"
void ReturnHomePage(GtkWidget *pReturnBtn, GSList *lAbsolute)
{
HomePage(lAbsolute);
}
#include "ReturnHomePage.c"
void ReturnHomePage(GtkWidget *pReturnBtn, GSList *lAbsolute);
我只是想要一种从绘图功能返回到主页功能的方法,因为我的功能不起作用。
但是对于我的程序我不能,因为它创建了#include
的无限循环
在每个头文件中,确保使用 header guard 以防止文件内容被多次引用...
some_header.h
//very top of file
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
// header content here
//very bottom of file
#endif
解决此问题的另一种方法:经验法则是永远不要 #include
.c
文件。这不是包含机制的目的,事情很快就会变得混乱。
我正在使用 c 和 gtk + 3 创建一个 GUI。我不知道这是否是正确的方法,但是当我想清除 window 并构建我的应用程序的另一个页面时,我把所有东西都放在一个盒子里,当“新页面”功能是叫。我创建了一个菜单,用于我的应用程序的功能,一卷骰子,我想要一个按钮从该页面返回到菜单谁角色骰子,但我的程序我不能,因为这会创建一个无限#include 循环,这是我的代码:
“主页”:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <gmodule.h>
#include "De.h"
void HomePage(GSList *lAbsolute)
{
GtkWidget *pWindow;
GtkWidget *pBoiteTotal;
GtkWidget *pBoiteHome;
GtkWidget *pDeBtn;
GtkWidget *pFicheBtn;
pWindow = (GtkWidget*) g_slist_nth_data(lAbsolute, 0);
pBoiteTotal = (GtkWidget*) g_slist_nth_data(lAbsolute, 1);
gtk_widget_destroy (pBoiteTotal);
pBoiteHome = gtk_box_new(GTK_ORIENTATION_VERTICAL, 50);
gtk_container_add(GTK_CONTAINER(pWindow), pBoiteHome);
lAbsolute = g_slist_append(lAbsolute,(GtkWidget*) pBoiteHome);
pDeBtn = gtk_button_new_with_label ("Lancer de de");
gtk_box_pack_start(GTK_BOX(pBoiteHome), pDeBtn, TRUE, TRUE, 0);
pFicheBtn = gtk_button_new_with_label ("Fiche des joueurs");
gtk_box_pack_start(GTK_BOX(pBoiteHome), pFicheBtn, TRUE, TRUE, 0);
gtk_widget_show_all(pWindow);
g_signal_connect(G_OBJECT(pDeBtn), "clicked", G_CALLBACK(Draw), lAbsolute);
}
家 page.h :
#include "homepage.c"
void HomePage(GSList *lAbsolute)
De.c中的Draw函数(我禁用了ReturnHomePage函数来停止循环)
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <gmodule.h>
#include "Lancer.h"
//#include "ReturnHomePage.h"
void Draw(GtkWidget *pDrawBtn, GSList *lAbsolute)
{
GtkWidget *pWindow;
GtkWidget *pImage;
GtkWidget *pBoiteHome;
GtkWidget *pBoiteDe;
GtkWidget *pBoiteReturnBtn;
GtkWidget *pReturnBtn;
GtkWidget *pImageReturnBtn;
pWindow = (GtkWidget*) g_slist_nth_data(lAbsolute, 0);
pBoiteHome = (GtkWidget*) g_slist_nth_data(lAbsolute, 6);
gtk_widget_destroy (pBoiteHome);
pBoiteDe = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(pWindow), pBoiteDe);
pBoiteReturnBtn = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add(GTK_CONTAINER(pBoiteDe), pBoiteReturnBtn);
pImageReturnBtn = gtk_image_new();
gtk_image_set_from_file(GTK_IMAGE(pImageReturnBtn), "img/btn/returnbtn.png");
pReturnBtn = gtk_button_new_with_label(NULL);
gtk_button_set_image(GTK_BUTTON(pReturnBtn), pImageReturnBtn);
gtk_box_pack_start(GTK_BOX(pBoiteReturnBtn), pReturnBtn, FALSE, FALSE, 0);
pImage = gtk_image_new();
gtk_box_pack_start(GTK_BOX(pBoiteDe), pImage, TRUE, FALSE, 0);
pDrawBtn = gtk_button_new_with_label("Lancer");
gtk_box_pack_start(GTK_BOX(pBoiteDe), pDrawBtn, TRUE, FALSE, 0);
gtk_widget_show_all(pWindow);
g_signal_connect(G_OBJECT(pDrawBtn), "clicked", G_CALLBACK(Lancer),(GtkWidget*) pImage);
//g_signal_connect(G_OBJECT(pReturnBtn), "clicked", G_CALLBACK(ReturnHomePage), lAbsolute);
}
De.h :
#include "De.c"
void Draw(GtkWidget *pDrawBtn, GSList *lAbsolute);
而 returnhomepage.c 是 .h
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <gmodule.h>
#include "HomePage.h"
void ReturnHomePage(GtkWidget *pReturnBtn, GSList *lAbsolute)
{
HomePage(lAbsolute);
}
#include "ReturnHomePage.c"
void ReturnHomePage(GtkWidget *pReturnBtn, GSList *lAbsolute);
我只是想要一种从绘图功能返回到主页功能的方法,因为我的功能不起作用。
但是对于我的程序我不能,因为它创建了#include
的无限循环在每个头文件中,确保使用 header guard 以防止文件内容被多次引用...
some_header.h
//very top of file
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
// header content here
//very bottom of file
#endif
解决此问题的另一种方法:经验法则是永远不要 #include
.c
文件。这不是包含机制的目的,事情很快就会变得混乱。