C结构中的不完整类型

时间:2016-12-23 18:39:45

标签: c header-files

我有以下项目结构:

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,事情就会得到解决。

2 个答案:

答案 0 :(得分:2)

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

因此编译器需要知道所有struct a(那里的所有字段)以找出struct b的布局(并且应该在struct b的定义点知道)

实际上,您最好在标题#include "a.h"的开头附近添加b.h。当然,您希望在头文件中添加include guards

顺便说一句,我的偏好是避免使用许多小标题,我更喜欢有一些大标题,甚至可能只有一个小项目的公共标题(你可能预编译 with { {1}},请参阅this回答)

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

答案 1 :(得分:0)

如果文件b.h使用表单文件a.h,那么根据定义,您必须在a.h

中包含b.h