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