我是C的新手,我的头文件结构存在问题。似乎当我从keyboard.h
中加入ps2.h
时,由于keyboard.h
最初包含ps2.h
,ps2.h
无法访问keyboard.h
&#39}定义
keyboard.h
#ifndef KEYBOARD
#define KEYBOARD
#include "ps2.h"
typedef enum {
KEY_UNDEFINED,
// letters
A,
B,
... many more keys
} Key;
typedef enum {
TYPE_UNDEFINED, PRESSED, RELEASED
} KeyEventType;
typedef struct {
Key key;
KeyEventType type;
} KeyEvent;
#define NULL {KEY_UNDEFINED, TYPE_UNDEFINED}
... function declarations, implemented in a keyboard.c file next to keyboard.h
#endif
ps2.h
#ifndef PS2
#define PS2
#include <stdbool.h>
#include "keyboard.h"
#define keycount 17
KeyEvent scanCodeSet1[] = { NULL, { ESCAPE, PRESSED },
{ DIGIT1, PRESSED }, { DIGIT2, PRESSED },
... many more codes
};
我在我的主文件中包含keyboard.h
。
就像我上面所说的那样,从RELEASED
访问的所有定义(例如ps2.h
)都不起作用。
许多错误消息符合此模式:
'PRESSED' undeclared here (not in a function)
如果有帮助,我会使用GCC。
答案 0 :(得分:1)
您的keyboard.h
文件存在一个主要问题:
#define NULL {KEY_UNDEFINED, TYPE_UNDEFINED}
您不应重新定义NULL
。它在标准库包含文件中定义,不提供这样的冲突定义非常重要。
关于包含订单问题:这是正在发生的事情:
"keyboard.h"
keyboard.h
定义KEYBOARD
keyboard.h
包含"ps2.h"
ps2.h
定义PS2
"keyboard.h"
递归keyboard.h
检查是否定义了KEYBOARD
,但是,内容未被解析。ps2.h
使用scanCodeSet1
中尚未定义的符号定义keyboard.h
,因为已跳过递归包含且keyboard.h
的封闭解析尚未看到它们。 您可以通过以下方式更正此问题:
ps2.h
keyboard.h
ps2.h
。让2个包含文件相互包含并不是一个好主意,您应该重新组织您的定义以避免这种情况:
keyboard.h
和ps2.h
所包含的第三个头文件来定义两者所需的符号。