我有以下项目结构:
file - a.h
#pragma once
struct best_fit_struct {
void *next;
size_t size;
};
file - b.h
#pragma once
typedef struct mm_t {
int type;
union {
struct best_fit_struct best_fit_mm;
} per_mm_struct;
void *memory;
} mm_t;
file - b.c
#include "a.h"
#include "b.h"
在使用gcc -c b.c
编译b.c时,会抛出以下错误
file best_fit_mm has incomplete data type
我在a.h
之前加了b.h
,所以排序对我来说很合适。
令人惊讶的是,如果我在a.h
中加入b.h
,事情就会得到解决。
答案 0 :(得分:2)
编译器必须知道每种数据类型的整个布局。例如。聚合中的每个字段,其偏移量(请参阅offsetof
),其大小(请参阅sizeof
),其对齐方式(请参阅alignof
)及其类型。
因此编译器需要知道所有struct a
(那里的所有字段)以找出struct b
的布局(并且应该在struct b
的定义点知道)
实际上,您最好在标题#include "a.h"
的开头附近添加b.h
。当然,您希望在头文件中添加include guards。
有时,要调试与预处理程序相关的错误,您可能会要求获取预处理表单(例如,使用gcc
然后查看gcc -C -E source.c > source.i
内的编辑器或寻呼机。)
答案 1 :(得分:0)
如果文件b.h
使用表单文件a.h
,那么根据定义,您必须在a.h
b.h