【发布时间】:2020-11-04 22:35:10
【问题描述】:
我有以下文件:
啊.h
#ifndef __A_H_
#define __A_H_
#include <B.h> // contains foo_t
typedef struct {
foo_t foo;
...
} baz_t;
#endif
B.h
#ifndef __B_H_
#define __B_H_
#include <A.h> // contains baz_t
typedef struct {
...
} foo_t;
extern int useful_func(baz_t d);
#endif
当我编译这个 B.h 拒绝编译抱怨 error: unknown type name 'baz_t'
我假设这个错误是由于两个文件之间的循环依赖造成的。但我想知道如何转发声明baz_t 来解决这个问题?我找到了与结构之间的循环依赖相关的答案。但我不确定我将如何解决这个问题。我会很感激这里的一些帮助。我正在寻找一个严格的 C99 解决方案。
编辑
- 我之前忘记提及这一点,但我已经使用了包含防护。
- 用户 KamilCuk 建议的一个非常明显的解决方案是将
useful_func移动到A.h。这也发生在我身上,但软件组织明智useful_func不幸属于B.h。这个问题也可能是设计不佳的反映。
【问题讨论】:
-
将
extern int useful_func(baz_t d);移动到A.h并从B.h中删除#include <A.h>- 问题已解决。 -
1) 我希望您使用的是#include guards。 2)您不需要“extern”限定词;原型
int useful_func(baz_t d);就足够了。 3) System headers 使用#include<some_standard_header.h>语法。您可能需要双引号 -#include "xyz.h"。 -
嗨@KamilCuk,你是绝对正确的,但我现在添加了一个编辑部分,提到了为什么我没有采用这种方法。
-
创建一个新标头
"useful_func.h",其中包含useful_func的extern(并包含必要的标头)。这也将允许“B.h”不再包含“A.h”。
标签: c struct c99 circular-dependency