2009-08-08 49 views
1

我有一个名为cpu.h的文件,其中包含两个名为register.h和addrmode.h的其他头文件。在cpu.h中定义了一个cpu_t结构体,这两个结构体都需要它们的功能。我尝试在其他两个包含文件中包含cpu.h,但没有包含任何内容。我猜测他们不包括在内,因为在cpu.h中设置了包含警卫。有谁知道如何解决这个问题?Tricky包含C中的情况

回答

10

声明cpu_t在其自己的头文件中,其他三个包括,也许types.h

+0

由于一吨的人,虽然我应该想到这一点:) – 2009-08-08 19:30:45

+0

要补充的,把一个包括后卫在cpu_t的头文件中,并且#include在你使用该结构的任何地方,这样你就不会突然失去内部依赖关系,如果你删除了其他头文件之一。 – 2009-08-10 00:41:56

0

你可以在cpu.h中定义struct cpu_t,然后它包含其他两个头文件?

其实我更喜欢Oren Trutner的回答。我的答案更脆弱---你真的不想要相互递归的头文件。

+0

我也同意,看起来像是对我的破解 – 2009-08-08 19:22:30

0

你已经说过“没有包含任何东西”,但是这是基于其他一些观察的推论。你看到什么错误信息?我认为我们需要更多信息。

+0

没有错误消息,只是没有任何定义可以从包含文件访问的事实。这是因为包括了警卫,而gcc确实不包括cpu.h. – 2009-08-08 19:28:28

3

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

1

要么安排register.h和addrmode.h,以便它们不需要结构的定义或将结构的声明移动到它自己的头部。

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

  • 定义结构CPU的类型定义:

    typedef结构的CPU cpu_type的;

  • 定义一个变量或指针类型的一个成员为结构CPU:

    结构CPU * PTR;

  • 声明类型结构的CPU的外部变量:

    的extern结构CPY myCpu;

  • 声明函数采取一个结构参数的cpu:

    无效美孚(结构CPU P);

所以主要的原因,需要一个结构的定义放在一个头,其目的不是提供definitin是:

  • 你在标题定义为成员的结构类型struct cpu:

    struct intelcpu {0} struct cpu base; };

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

+0

如果您在需要register.h和addrmode.h的文件中使用内部结构的函数,您不必小心。如果你首先包含cpu.h,那么'struct cpu;'破坏了先前的定义,在现在不完整的结构中没有成员;如果你首先不包含cpu.h(除了可能是config.h之外的所有头文件),那么你并没有表明cpu.h可以独立运行,这会影响它的可用性(并且违反了明智的C编码标准的颁布由美国宇航局戈达德太空飞行中心)。 – 2009-08-08 19:52:48

+0

你从哪里得到了struct cpu;会打破以前的定义?如果没有定义的声明是不可能的,你将如何定义相互递归类型。事实上,我受到C++实践的影响,这是一个读取struct cpu的行;单独在C中是不需要的(在C++中,它与typedef struct cpu cpu具有相同的效果;因为标记名称是自动键入的名称)。我会完成我的回答。 – AProgrammer 2009-08-09 06:27:47