【问题标题】:How do I refer to a typedef in a header file?如何在头文件中引用 typedef?
【发布时间】:2013-11-21 20:30:59
【问题描述】:

我有一个定义了 typedef 结构的源文件:

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

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

只写对吗

typedef *Node;

在标题中?

【问题讨论】:

  • 你为什么不在你的头文件中写下整个结构......并在你的源文件中使用*Node

标签: c header typedef


【解决方案1】:

你可以使用:

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

【讨论】:

  • typedef struct node node; 并摆脱大写怪异。
  • @Potatoswatter 是的。我只是不想通过更改他/她的命名约定来混淆他/她。
【解决方案2】:

声明

typedef *Node;

无效。它缺少类型。查看typedef 的一个好方法是记住它只是一个存储类说明符,因此,它与任何其他声明一样工作。如果要为struct node * 类型创建别名Node,只需声明一个节点指针并将其命名为Node

struct node *Node;

现在添加 typedef 关键字:

typedef struct node *Node;

一般来说,要为一个类型创建一个别名,你只需声明一个与你想要的别名同名的该类型的变量,然后在前面加上一个typedef 关键字。即使是复杂的typedef 声明也可以像这样轻松处理。

所以,typedef *Node; 无效,就像只写 j; 而没有实际指定其类型。

现在,你不能typedef 两次。要么您必须将 typedefstruct node 声明中移出并将其移至头文件,要么将整个 typedef + 结构声明移至头文件。前一种解决方案通常是您想要的,因为它允许您隐藏一些信息。所以,我的建议是写在头文件中:

typedef struct node *Node_ptr;

并将其保存在源文件中:

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

请注意,我创建了别名 Node_ptr,而不是 Node。这是一种很好的做法,可以传达Node_ptr 是一个指针的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多