C结构中的不完整类型

我有以下项目结构:

文件 – 啊

#pragma once struct best_fit_struct { void *next; size_t size; }; 

档案 – bh

 #pragma once typedef struct mm_t { int type; union { struct best_fit_struct best_fit_mm; } per_mm_struct; void *memory; } mm_t; 

文件 – bc

 #include "ah" #include "bh" 

在使用gcc -c bc编译bc时,它会抛出以下错误

file best_fit_mm has incomplete data type

我在bh之前已经包括ah ,所以顺序看起来对我来说很合适。

令人惊讶的是,如果我在bh包含ah ,事情就会得到解决。

编译器必须知道每种数据类型的整个布局。 例如聚合中的每个字段,其偏移量(请参见offsetof ),其大小(请参阅sizeof ),其对齐方式(请参阅alignof )及其类型。

所以编译器需要知道所有struct a (那里的所有字段)来计算struct b的布局(并且应该在struct b的定义点知道)。

在实践中,你最好在标题开头附近添加#include "ah" 。 当然,您希望在头文件中添加包含警戒 。

顺便说一句,我的偏好是避免使用很多小标题,我更喜欢有一些大标题,甚至可能是一个小项目的公共标题(你可以用gcc 预编译 ,看看这个答案)

有时,为了调试与预处理器相关的错误,您可能会要求获得预处理的表单(例如,使用gcc -C -E source.c > source.i然后使用gcc -C -E source.c > source.i的编辑器或寻呼机查看)。

如果文件bh使用项目表单文件ah那么你必须按照定义在bh包含ah