#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 文件。这不是包含机制的目的,事情很快就会变得混乱。