遇到问题
问题描述:
我对C相当陌生,并且遇到了我的头文件结构问题。看来,当我包括keyboard.h
从ps2.h
,因为keyboard.h
最初包括ps2.h
第一,ps2.h
不能访问keyboard.h
的定义。遇到问题
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
在我的主文件。
就像我上面所说的那样,从ps2.h
访问的所有定义(例如RELEASED
)都不起作用。
的许多错误消息符合这一模式:
'PRESSED' undeclared here (not in a function)
我用GCC是否有帮助。
答
。在你的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
。 - 包括来自C文件的头文件。
它是不是有2个包含文件互相包含,你应该重新组织你的定义,以避免一个好主意:
- 使用一个头文件
- 使用包括第三头文件由定义两者所需的符号的
keyboard.h
和ps2.h
。
你在这里有一个循环依赖。为什么你需要两个头包含对方? – user3528438
因为'ps2.h'在'keyboard.h'中调用函数,反之亦然。 –
不,标题中的代码通常不会调用函数,它们应该只是声明。 – user3528438