C中的棘手包含情况

zxlwwiss  于 2023-10-16  发布在  其他
关注(0)|答案(5)|浏览(87)

我有一个名为cpu. h的文件,其中包括另外两个名为register. h和addrmode. h的头文件。在cpu. h中定义了一个cpu_t结构体,这两个结构体包含了它们函数的需要。我尝试将cpu. h包含在另外两个包含文件中,但没有包含任何内容。我猜它们没有被包括在内,因为cpu. h中设置了包含警卫。有人知道如何解决这个问题吗?

kcugc4gi

kcugc4gi1#

cpu_t放在它自己的头文件中,其他三个头文件也包括在内,也许是types.h

gudnpqoy

gudnpqoy2#

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

slmsl1lt

slmsl1lt3#

要么安排register. h和addrmode. h,使它们不需要结构体的定义,要么将结构体的声明移到它自己的头部。
注意,你不需要CPU的定义:

  • 为struct cpu定义typedef:

typedef struct cpu cpu_type;

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

struct cpu *ptr;

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

extern struct cpy;

  • 声明一个带struct cpu参数的函数:

void foo(struct);
因此,需要在标头中定义结构(其目的不是提供该定义)主要原因是:

  • 你在头文件中定义了一个结构体,它的成员类型为struct cpu:

struct intelcpu { struct cpu base;};

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

6ioyuze24#

你可以在cpu. h中定义结构cpu_t,然后再包含其他两个头文件?
事实上,我更喜欢Oren Trutner的回答。我的回答是更脆弱的---你真的不想要相互递归的头文件。

zaqlnxep

zaqlnxep5#

你说“什么都不包括在内”,但这是根据其他一些观察作出的推论。您看到了什么错误消息?我想我们需要更多的信息。

相关问题