如何在头文件中引用typedef?

时间:2013-11-21 12:18:56

标签: c header typedef

我有一个源文件,其中定义了一个typedef结构:

typedef struct node {
    char *key;
    char *value;
    struct node *next;
} *Node;

在此模块中,有一些函数在Node上运行,并将Node作为返回类型。我应该在这个typedef的头文件中写什么?

只写

是否正确
typedef *Node;
标题中的

2 个答案:

答案 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是指针的想法。