我有一个源文件,其中定义了一个typedef结构:
typedef struct node {
char *key;
char *value;
struct node *next;
} *Node;
在此模块中,有一些函数在Node上运行,并将Node作为返回类型。我应该在这个typedef的头文件中写什么?
只写
是否正确typedef *Node;
标题中的?
答案 0 :(得分:9)
您可以使用:
typedef struct node * Node;
但我建议不要将指针隐藏在类型声明中。在变量声明中提供这些信息更具信息性。
<强>的module.c:强>
#include "module.h"
struct node {
char *key;
char *value;
struct node *next;
};
<强> module.h中:强>
typedef struct node Node;
指针的变量声明:
#include "module.h"
Node * myNode; // We don't need to know the whole type when declaring pointer
答案 1 :(得分:0)
声明
typedef *Node;
无效。它缺少类型。查看typedef
的一个好方法是记住它只是一个存储类说明符,因此,它的工作方式与其他任何声明一样。如果要为类型Node
创建别名struct node *
,只需声明节点指针并将其命名为Node
:
struct node *Node;
现在预先添加typedef
关键字:
typedef struct node *Node;
通常,要为类型创建别名,只需声明一个与您希望的别名同名的该类型的变量,然后添加typedef
关键字。即使复杂的typedef
声明也可以像这样轻松接近。
因此,typedef *Node;
无效,就像只编写j;
而没有实际指定其类型。
现在,你不能typedef
两次。您必须从typedef
声明中取出struct node
并将其移至头文件,或者将整个typedef
+结构声明移动到头文件中。前一种解决方案通常是您想要的,因为它允许您隐藏一些信息。所以,我的建议是在头文件中写这个:
typedef struct node *Node_ptr;
并将其保存在源文件中:
struct node {
char *key;
char *value;
struct node *next;
};
请注意,我创建了别名Node_ptr
,而不是Node
。这是一种很好的做法,可以传达Node_ptr
是指针的想法。