【问题标题】:Unknown type name "list" on C programC程序上的未知类型名称“列表”
【发布时间】:2017-01-24 19:14:18
【问题描述】:

在更多文件 .c 和 .h 上拆分程序时遇到问题 在 main.c 我放了一个结构像

struct listnumbers {
  float number;
  struct listnumbers *next;
};typedef struct listnumbers *list;

当我需要编译所有文件 .c .h 和编译器给我一个错误,比如 Unknown type name "list" onsorting.h = void sort(list *pt,float number)

【问题讨论】:

  • read about how to ask good questions 学习如何创建Minimal, Complete, and Verifiable Example。我们需要查看完整且未经编辑的实际错误。我们需要首先查看导致错误的来源。
  • 在不相关的注释上,您确定要将list 定义为指针吗?例如,您展示了sorting 函数,该函数将指向list 的指针作为其第一个参数。这意味着它是一个struct listnumbers **,一个指向指针的指针。这是故意的吗?将类型定义为指针(就像您所做的那样)迟早会导致混淆,如果不是与您有关,那么与阅读您的代码的人有关。
  • struct listnumbers { float number; struct listnumbers *next; }; typedef struct listnumbers *list; void sorting(list *pt, float number); int main() { } 在这里编译得很好。你的问题是listsorting.h 中是未知的。你可能需要一个list.h,它必须包含在sort.h中。
  • 如果在编译所有文件.c.h 时出现问题,为什么不发布其中的一些文件,而不仅仅是关注struct 的定义?您是否在所有使用它的地方都包含了该定义?确定编译器是否抱怨找不到类型list,是因为该类型没有在任何地方定义。想想编译器无法识别该类型会发生什么。也许其他地方有错字? struct 的定义是正确的,也是 typedef,因为你在那里写的。

标签: c


【解决方案1】:

C 区分大小写。 Struct 应该是 struct

在 C 中使用结构的方法是

  1. 不要为结构体的 typedef 操心,它们没用,只会让你不用输入 struct 关键字
  2. 仅在需要struct 的文件中在公共头文件和#include 中声明结构。换句话说,编写一个合适的interface并将接口声明放在头文件中,将接口实现放在C文件中。

【讨论】:

  • ...它们没用,只省了你输入 struct 关键字:所以它们不是没用的我说。
  • @TomasF。考虑到可维护性的损失,保存几个字符来输入是没有用的。当我看到struct mumble x 时,我立即意识到我必须使用. 并且永远找不到x 的printf 格式,而使用mumble x 我是盲人。人们做什么?为typedef struct mumble mumble_s 中的后缀添加额外字符。那是,错误,疯狂。 Peter van der Linden 在他的Expert C Programming -- Deep C Secrets 一书中更详细地介绍了。
  • Jens (I.) 也许您可以解释一下您所说的失去可维护性是什么意思。我不明白为什么一个完全替换原始关键字并且定义在下面一行的别名会损害任何东西。 (II.) 当我在纯 C 中看到诸如 mumble 之类的非保留类型标识符时,我知道,它是一个结构或其他东西,不管结构关键字。 (III.) 为什么要那样做?我也可以使用typedef struct uglyNam_e niceName
【解决方案2】:

您需要在包含使用该结构的 .h 文件中定义您的结构。

sorting.h 上的未知类型名称“list” 试图告诉您,在处理 sorting.h 时,list 是未知的。

你也可以通过结合 typedef + struct 来缩短 ist 定义。

typedef struct listnumbers {
  float number;
  struct listnumbers *next;
} *list;

【讨论】:

  • typedef 结构体?
  • 我需要删除 main.c 上的 struct 并将其仅放在 .h 文件上对吗?然后我将在 main.c 上包含 .h 文件
  • 是的,正如我所说,编译器不知道list。简单来说,您可以在 .h 文件中定义“什么”,在 .c 文件中定义“如何”。定义你的结构是“什么”的一部分
  • @zehunixed typedef struct a { ... } b; 是两件事。 typedef 声明将 b 定义为新类型的类型名称。以及struct a 类型的struct 定义。您可以同时执行这两种操作,因为 C 需要类型定义作为 typedef 语句的参数,而不仅仅是类型名称。无论哪种方式,您的问题都不在您显示的陈述中。编辑问题并展示您如何安排单独的 .c.h 文件以将定义包含在所有编译单元中。
猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 2013-09-25
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多