我正在使用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
这是因为它没有看到屏幕声明。该如何解决?
答案 0 :(得分:4)
警告是当对结构的第一个引用位于其他内部时。
将struct screen;
放在struct window
的声明上方。
头文件的循环依赖性不是一个好主意。考虑重构。您不需要结构的定义即可声明指向它的指针。向前声明就足够了。
答案 1 :(得分:2)
这是关于基础设计的,仅此而已。要让两个相互包含的头文件根本没有任何意义,请不要这样做。 #include
被视为单向依赖项。在程序设计中,较复杂的对象取决于/由较不复杂的对象组成。
例如,一个屏幕包含一个窗口,因此它应该是执行#include "window.h"
的窗口。虽然窗口对屏幕一无所知,但它只应与显示窗口有关。两个模块之间的交叉通信可能必须在第三个模块中。