在 C 中转发声明一个结构
Forward declare a struct in C
如何转发声明以下 treeNodeListCell
结构?
我尝试在结构定义之前写 struct treeNodeListCell
,但代码无法编译。
有人知道吗?
struct treeNodeListCell;
typedef struct _treeNode {
treeNodeListCell *next_possible_positions;
} treeNode;
typedef struct _treeNodeListCell {
treeNode *node;
struct _treeNodeListCell *next;
} treeNodeListCell;
C中不能省略struct
你应该使用
struct treeNodeListCell *next_possible_positions;
而不是
treeNodeListCell *next_possible_positions;
你可以前向声明一个struct
,但是当你这样做时,你需要使用struct
关键字和前向声明的[=13] =] 标签。
struct _treeNodeListCell;
typedef struct _treeNode {
struct _treeNodeListCell *next_possible_positions;
} treeNode;
typedef struct _treeNodeListCell {
treeNode *node;
struct _treeNodeListCell *next;
} treeNodeListCell;
备选方案是前向声明的 typedef
。 C允许你typedef
一个不完整的类型,也就是说你可以typedef
结构体之前定义结构体。这允许您在结构定义中使用 typedef。
typedef struct _treeNodeListCell treeNodeListCell;
typedef struct _treeNode {
treeNodeListCell *next_possible_positions;
} treeNode;
struct _treeNodeListCell {
treeNode *node;
treeNodeListCell *next;
};
如果你想使用问题中的结构而不改变它们,你只需要结构定义前的typedef
。
typedef struct _treeNodeListCell treeNodeListCell;
typedef struct _treeNode {
treeNodeListCell *next_possible_positions;
} treeNode;
typedef struct _treeNodeListCell {
treeNode *node;
struct _treeNodeListCell *next;
} treeNodeListCell;
Quick question, how do I forward declare the following treeNodeListCell
struct.
你不需要。
您首先必须区分通过标记识别结构类型和通过 typedef
ed 别名识别它。特别是,您需要了解 typedef
是 完全可选的 。在使用它为结构类型定义别名的地方,将 typedef
声明与结构声明分开可能会更清楚。
这是你的声明,没有任何 typedef
:
struct _treeNode {
struct _treeNodeListCell *next_possible_positions;
};
struct _treeNodeListCell {
struct _treeNode *node;
struct _treeNodeListCell *next;
};
以 struct <tag>
形式表示的结构类型不需要前向声明。
您也可以添加 typedef。它们可以通过添加 typedef
关键字和一个或多个标识符与上面的定义相关联,或者它们可以简单地单独编写,正如我之前推荐的:
typedef struct _treeNode treeNode;
typedef struct _treeNodeListCell treeNodeListCell;
就我个人而言,我认为 typedef 被过度使用了。我通常不为我的结构和联合类型定义 typedef
别名。
BUT 如果你真的想这样做,那么你可以声明一个不完整类型的 typedef,比如一个尚未定义的结构类型。这是一个常规声明,而不是前向声明,但它允许您在结构定义中使用别名,我认为这是您的 objective:
typedef struct _treeNode treeNode;
typedef struct _treeNodeListCell treeNodeListCell;
struct _treeNode {
treeNodeListCell *next_possible_positions;
};
struct _treeNodeListCell {
treeNode *node;
treeNodeListCell *next;
};
其实从C11开始,可以在同一个范围内写多个同typedef
名字的声明,只要它们都定义了名字来标识同一个类型即可。可以利用此条款来允许编译问题中出现的 typedef / 结构声明。请注意,指定相同的类型不需要以相同的方式表达。由于这应该是一个练习,我将留给您解决剩下的一些细节问题。
如何转发声明以下 treeNodeListCell
结构?
我尝试在结构定义之前写 struct treeNodeListCell
,但代码无法编译。
有人知道吗?
struct treeNodeListCell;
typedef struct _treeNode {
treeNodeListCell *next_possible_positions;
} treeNode;
typedef struct _treeNodeListCell {
treeNode *node;
struct _treeNodeListCell *next;
} treeNodeListCell;
C中不能省略struct
你应该使用
struct treeNodeListCell *next_possible_positions;
而不是
treeNodeListCell *next_possible_positions;
你可以前向声明一个struct
,但是当你这样做时,你需要使用struct
关键字和前向声明的[=13] =] 标签。
struct _treeNodeListCell;
typedef struct _treeNode {
struct _treeNodeListCell *next_possible_positions;
} treeNode;
typedef struct _treeNodeListCell {
treeNode *node;
struct _treeNodeListCell *next;
} treeNodeListCell;
备选方案是前向声明的 typedef
。 C允许你typedef
一个不完整的类型,也就是说你可以typedef
结构体之前定义结构体。这允许您在结构定义中使用 typedef。
typedef struct _treeNodeListCell treeNodeListCell;
typedef struct _treeNode {
treeNodeListCell *next_possible_positions;
} treeNode;
struct _treeNodeListCell {
treeNode *node;
treeNodeListCell *next;
};
如果你想使用问题中的结构而不改变它们,你只需要结构定义前的typedef
。
typedef struct _treeNodeListCell treeNodeListCell;
typedef struct _treeNode {
treeNodeListCell *next_possible_positions;
} treeNode;
typedef struct _treeNodeListCell {
treeNode *node;
struct _treeNodeListCell *next;
} treeNodeListCell;
Quick question, how do I forward declare the following
treeNodeListCell
struct.
你不需要。
您首先必须区分通过标记识别结构类型和通过 typedef
ed 别名识别它。特别是,您需要了解 typedef
是 完全可选的 。在使用它为结构类型定义别名的地方,将 typedef
声明与结构声明分开可能会更清楚。
这是你的声明,没有任何 typedef
:
struct _treeNode {
struct _treeNodeListCell *next_possible_positions;
};
struct _treeNodeListCell {
struct _treeNode *node;
struct _treeNodeListCell *next;
};
以 struct <tag>
形式表示的结构类型不需要前向声明。
您也可以添加 typedef。它们可以通过添加 typedef
关键字和一个或多个标识符与上面的定义相关联,或者它们可以简单地单独编写,正如我之前推荐的:
typedef struct _treeNode treeNode;
typedef struct _treeNodeListCell treeNodeListCell;
就我个人而言,我认为 typedef 被过度使用了。我通常不为我的结构和联合类型定义 typedef
别名。
BUT 如果你真的想这样做,那么你可以声明一个不完整类型的 typedef,比如一个尚未定义的结构类型。这是一个常规声明,而不是前向声明,但它允许您在结构定义中使用别名,我认为这是您的 objective:
typedef struct _treeNode treeNode;
typedef struct _treeNodeListCell treeNodeListCell;
struct _treeNode {
treeNodeListCell *next_possible_positions;
};
struct _treeNodeListCell {
treeNode *node;
treeNodeListCell *next;
};
其实从C11开始,可以在同一个范围内写多个同typedef
名字的声明,只要它们都定义了名字来标识同一个类型即可。可以利用此条款来允许编译问题中出现的 typedef / 结构声明。请注意,指定相同的类型不需要以相同的方式表达。由于这应该是一个练习,我将留给您解决剩下的一些细节问题。