C 中的棘手包含情况

问题描述 投票:0回答:5

我有一个名为 cpu.h 的文件,其中包含另外两个名为 register.h 和 addrmode.h 的标头。 cpu.h 中定义了 cpu_t 结构,两者包含其功能的需要。我尝试将 cpu.h 包含在另外两个包含文件中,但没有包含任何内容。我猜测它们没有被包含在内,因为在 cpu.h 中设置了包含防护。有谁知道这个问题如何解决?

c include circular-dependency include-guards
5个回答
9
投票

在其他三个包含的头文件中声明

cpu_t
,也许
types.h


3
投票

循环包含可能会给代码维护和调试带来麻烦。我建议将 cpu.h 分成两个文件:一个包含 register.h 和 addrmode.h,另一个包含这两个文件。


1
投票

要么安排 register.h 和 addrmode.h,以便它们不需要结构体的定义,要么将结构体的声明移至其自己的标头。

注意,你不需要cpu的定义:

  • 为 struct cpu 定义 typedef:

    typedef 结构体 cpu cpu_type;

  • 定义一个变量或一个指向struct cpu的指针类型的成员:

    struct cpu *ptr;

  • 声明 struct cpu 类型的 extern 变量:

    extern struct cpy myCpu;

  • 声明采用 struct cpu 参数的函数:

    void foo(struct cpu p);

因此,需要在标头中定义结构的主要原因是:

  • 您在标头中定义了一个具有 struct cpu 类型成员的结构:

    struct intelcpu { 结构cpu基数; };

  • 您定义需要访问成员或具有该类型的局部变量的内联函数


0
投票

您可以在 cpu.h 中定义 struct cpu_t ,然后再包含其他两个标头吗?

实际上,我更喜欢奥伦·特鲁特纳的回答。我的答案更加脆弱——你真的不想要相互递归的头文件。


0
投票

您曾说过“不包含任何内容”,但这是基于其他一些观察的推论。您看到什么错误消息?我认为我们需要更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.