gpt4 book ai didi

c - 标题有问题

转载 作者:行者123 更新时间:2023-11-30 15:11:04 27 4
gpt4 key购买 nike

我对 C 相当陌生,并且我的头文件结构有问题。似乎当我从 ps2.h 中包含 keyboard.h 时,因为 keyboard.h 最初包含 ps2.h > 首先,ps2.h 无法访问 keyboard.h 的定义。

键盘.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 使用 keyboard.h 中尚 undefined symbol 定义 scanCodeSet1,因为递归包含已被跳过并且封闭keyboard.h 的解析尚未看到它们。

您可以通过以下任一方法纠正此问题:

  • 不包括 keyboard.h 中的 ps2.h
  • ps2.h 移至所需定义之后。
  • 包含 C 文件中的两个 header 。

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

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

关于c - 标题有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35818945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com