2016-03-05 153 views
0

我对C相当陌生,并且遇到了我的头文件结构问题。看来,当我包括keyboard.hps2.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是否有帮助。

+2

你在这里有一个循环依赖。为什么你需要两个头包含对方? – user3528438

+0

因为'ps2.h'在'keyboard.h'中调用函数,反之亦然。 –

+1

不,标题中的代码通常不会调用函数,它们应该只是声明。 – user3528438

回答

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.hkeyboard.h
  • 移动所需有定义后列入ps2.h
  • 包括来自C文件的头文件。

它是不是有2个包含文件互相包含,你应该重新组织你的定义,以避免一个好主意:

  • 使用一个头文件
  • 使用包括第三头文件由定义两者所需的符号的keyboard.hps2.h