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 问题发生了,而不是简单地盲目修复它。
我无法解决下一个问题:
//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 问题发生了,而不是简单地盲目修复它。