如何在另一个头文件中包含c头文件?

时间:2019-03-25 14:36:46

标签: c

我正在使用curses库编写一个c程序,并希望创建一些反映我的应用程序UI的结构。

这是我的app.c文件

#include <stdlib.h>
#include <stdio.h>
#include "screen.h"

int main() {
    struct screen scr = {
        .win1 = {
            .title = "win1"
        },
        .win2 = {
            .title = "win2"
        }
    };
}

这里是screen.h

#ifndef SCREEN_H
#define SCREEN_H

#include "window.h"

struct screen {
    struct window win1;
    struct window win2;

    struct window *focused;
};

#endif

这是window.h

#ifndef WINDOW_H
#define WINDOW_H

#include "screen.h"

struct window {
    char *title;
    void (*handle_key_event)(struct screen*);
};

#endif

我的窗口结构句柄方法必须接收对屏幕的引用,以便在某些特定情况下能够更改焦点窗口。但是当我编译它时,我得到了警告

window.h:8:34: warning: its scope is only this definition or declaration, which is probably not what you want

这是因为它没有看到屏幕声明。该如何解决?

2 个答案:

答案 0 :(得分:4)

警告是当对结构的第一个引用位于其他内部时。

struct screen;放在struct window的声明上方。

头文件的循环依赖性不是一个好主意。考虑重构。您不需要结构的定义即可声明指向它的指针。向前声明就足够了。

答案 1 :(得分:2)

这是关于基础设计的,仅此而已。要让两个相互包含的头文件根本没有任何意义,请不要这样做。 #include被视为单向依赖项。在程序设计中,较复杂的对象取决于/由较不复杂的对象组成。

例如,一个屏幕包含一个窗口,因此它应该是执行#include "window.h"的窗口。虽然窗口对屏幕一无所知,但它只应与显示窗口有关。两个模块之间的交叉通信可能必须在第三个模块中。

相关问题