【问题标题】:Incomplete type in C struct [closed]C结构中的不完整类型[关闭]
【发布时间】:2016-12-24 16:35:43
【问题描述】:

我有以下项目结构:

文件 - a.h

#pragma once

 struct best_fit_struct {
    void *next;
    size_t size;
};

文件 - 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;

文件 - b.c

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

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

file best_fit_mm has incomplete data type

我在b.h 之前添加了a.h,所以排序对我来说很合适。

令人惊讶的是,如果我在b.h 中包含a.h,事情就会得到解决。

【问题讨论】:

  • "所以我不想将 a.h 包含在其中。" - 由于您遇到的错误,不会发生。如果没有struct a 的定义,编译器如何知道union 的大小?
  • @FaizHalde:不,除非你#include "a.h"。你不能只排除这一点。这是编译器如何工作的规则。无论如何,它无法在没有struct a 的定义的情况下编译。
  • “令人惊讶的是,如果我在 b.h 中包含 a.h,事情就会得到解决。”
  • @FaizHalde,因为它对我有用,所以有些事情你可能没有告诉我们。您是否使用 gcc 的 -E 标志仅运行预处理器并查看结果以确保包含按预期工作?我敢打赌,在a.h 之前还有其他内容包括b.h
  • 对不起,伙计们。确实是缺少导致问题的头文件。解决了。谢谢!我应该发布只包含 b.h 文件的 main.c 文件

标签: c header-files


【解决方案1】:

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

所以编译器需要知道所有struct a(那里的所有字段)才能确定struct b的布局(这应该在struct b的定义点知道)。

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

顺便说一句,我的偏好是避免有很多小标题,我更喜欢有几个大标题,甚至可能是一个小项目的一个通用标题(您可以使用@预编译 987654334@,见this答案)

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

【讨论】:

  • 这是真的,“你最好添加”。但是,它也应该在作者询问的情况下编译。
  • 您的偏好对单元测试很不利。
【解决方案2】:

如果文件b.h 使用文件a.h 中的项目,那么根据定义,您必须在b.h 中包含a.h

【讨论】:

  • 我想对我自己的帖子发表评论:这不能回答 OP 的问题。据我了解,#include 应该是复制和粘贴。如果在.c文件中都按顺序复制和粘贴,为什么它拒绝编译呢?当a.h 包含在b.h 中时应该发生完全相同的事情?
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多