C 一些头部相互包含

C Some headers include each other

我无法解决下一个问题:

//foo.h
#ifndef FOO_H_
#define FOO_H_

#include "BAR.h"
#include "foos/foo_bazz.h"


typedef struct
{
   ...
} FOO;

// HERE I HAVE CALL `foo_baz(foo, bar);`
void
foo_bar(FOO *foo, BAR *bar);

#endif /* FOO_H_ */
//bar.h
#ifndef BAR_H_
#define BAR_H_

typedef struct
{
   ...
} BAR;

#endif /* BAR_H_ */
//foos/foo_bazz.h
#ifndef FOO_BAZZ_H_
#define FOO_BAZZ_H_

#include "FOO.h"
#include "BAR.h"

void
foo_baz(FOO *foo, BAR *bar);


#endif /* FOO_BAZZ_H_ */

所以它会产生这样的错误:

foos/foo_bazz.h: error: unknown type name ‘FOO’; did you mean ‘FOO_H_’?
   16 |     FOO *foo,
      |     ^~~~
      |     FOO_H_

我试图从 foos/foo_bazz.h 中删除 #include "FOO.h" 并添加 typedef struct FOO;typedef struct FOO FOO; 但它没有做一些改变...

我也尝试过反函数 - 我在 FOO.h 中声明了函数,但结果是一样的。

请帮帮我,谢谢

为什么要将 foo_bazz 包含在 foo.h 中?

肯定会失败。在 foo_bazz.h 中包含 foo.h 不会声明该类型,因为它已经受到保护。

没有意义。只需将 foo_bazz.h 包含在您的 .c 文件中,您将在其中定义函数和数据。 IMO X-Y 问题。

问题在于声明:

void foo_baz(FOO *foo, BAR *bar);
在定义 FOO 之前遇到

。您可以通过重新排序 foo.h 中的代码来解决该问题:

#include "BAR.h"

typedef struct
{
   ...
} FOO;

#include "foos/foo_bazz.h"

void
foo_bar(FOO *foo, BAR *bar);

也就是说@0___________ 的解决方案在大多数情况下更有意义,包括这种情况,但值得理解why/how 问题发生了,而不是简单地盲目修复它。