未知类型名称 C

5
我知道在使用之前必须先定义好变量,但我遇到了“未知类型名称错误”的问题。
这是我的“Node”定义:
struct Node  {
    position* p;
    struct Node* next;
    struct Node* prev;
};

这是我的声明(第96行):
Node* hashtable[HashArraySize];

我收到了以下错误信息:

P1.c:96:1: error: unknown type name ‘Node’
 Node* hashtable[HashArraySize];

3
typedef struct Node Node; 的翻译是:定义一个名为Node的结构体类型。 - BLUEPIXY
2
或者 struct Node* hashtable[HashArraySize]; - yano
2个回答

9

与 C++ 不同的是,C 不把 struct 标签视作新类型名称,如果您想在不使用 struct 的情况下使用 Node,则需要显式地进行 typedef:

typedef struct Node Node;

或者,你可以在声明中使用 struct Node

struct Node* hashtable[HashArraySize];

在您的意见中,哪种更干净/更好? - J. Jones
2
@A.Allen 如果有多个函数需要使用 struct Node,那么使用 typedef 更加清晰。如果只有一两个地方需要使用 Node,那么使用 struct Node 稍微更加简洁。重要的是决定一种方法,并对所有的 struct 保持一致性。 - Sergey Kalinichenko
@A.Allen 个人而言,我不喜欢使用 typedef。我喜欢知道我正在使用什么。当我不得不在嵌套的 .h 文件中搜索以找出某些东西时(在 IDE 中不错,在 Vi 中很糟糕(grep 有所帮助)),我会感到非常恼火。还有我个人最喜欢的一点是,当来自不同地方的两个 .h 文件将两个不同的类型 typedef 为相同的名称时。在我看来,只有在类型名称真的“很长”或者你的代码将在几个不同的平台上运行且每个平台的原始类型可能/是不同的情况下才需要使用 typedef。有经验的老手请告诉我我错在哪里。 - yano

6

Node* hashtable[HashArraySize]; 改为 struct Node* hashtable[HashArraySize];

或者

typedef struct Node  {
    position* p;
    struct Node* next;
    struct Node* prev;
} Node;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接