标题有问题

时间:2016-03-05 19:42:49

标签: c

我是C的新手,我的头文件结构存在问题。似乎当我从keyboard.h中加入ps2.h时,由于keyboard.h最初包含ps2.hps2.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。

1 个答案:

答案 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
  • 包含C文件中的两个标题。

让2个包含文件相互包含并不是一个好主意,您应该重新组织您的定义以避免这种情况:

  • 使用单个头文件
  • 使用keyboard.hps2.h所包含的第三个头文件来定义两者所需的符号。