我有这样的情况:

A.hB.h

A.h年中:

typedef struct TypeA TypeA_t;
struct TypeA {
    ...
    TypeA_t *a;
    void (*doSomething)(TypeB_t *);
};

B.h年中:

typedef struct TypeB TypeB_t;
struct TypeB {
    ...
    TypeB_t *b;
    TypeA_t something;
};

在每个文件中包含头文件的正确方式是什么?

如果在B.h中包含A.h,在A.h中包含B.h,则得到:

A.h英寸error: unknown type name 'TypeB_t'英寸

B.h英寸error: unknown type name 'TypeA_t'英寸

我在这里发现了一个类似的问题,但它不适用于我的情况.

推荐答案

按照您定义代码的方式,TypeA可以使用对TypeB的前向引用,但TypeB需要TypeA的完整声明才能编译.

换句话说,你需要做两件事.首先在类定义之前向前定义a.h中的TypeB(因为指针可以与分部定义一起使用):

//a.h
typedef struct TypeB TypeB_t;

typedef struct TypeA TypeA_t;
struct TypeA {
...
TypeA_t *a;
void (*doSomething)(TypeB_t*);
};

然后包括b.h中的a.h以获得类的声明(因为您使用完整的TypeA类作为字段类型):

// b.h
#include "a.h"

typedef struct TypeB TypeB_t;
struct TypeB {
...
TypeB_t *b;
TypeA_t something;
};

C++相关问答推荐

代码打印正确输出次数过多(CS50)

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

想了解 struct 指针和空指针转换

malloc实现:判断正确的分配对齐

va_copy的使用是未定义的行为吗?

如何在Visual Studio代码中关闭此函数名称显示功能?

无法用C++编译我的单元测试

警告:C++中数组下标的类型为‘char’[-Wchar-subpts]

如何使用低级C++写出数值

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

从纯C中访问通用项对话框

Make Node函数.S有什么问题吗?

为什么指针运算会产生错误的结果?

如何用c语言修改shadow文件hash部分(编程)?

C标准关于外部常量的说明

有没有一种方法可以用C创建保留限定符的函数?

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

Realloc():中止的下一个大小无效(核心转储)

如何在C中定义指向函数的指针并将该指针赋给函数?

存储和访问指向 struct 的指针数组