typedef struct clarity

3
我对typedef感到困惑,有人能用普通的结构体描述一下吗?我真的不想处理typedef,因为它让我感到困惑。
struct stackNode
{
  int data;
  struct stackNode *nxtptr;
};

typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;

typedef struct stackNode StackNode;struct stackNode StackNode相同,typedef StackNode *StackNodePtr;struck stackNode *StackNodePtr相同吗?

6个回答

7
如果您不想使用typedef,您可以始终使用完整的类型名称:
而不是:
StackNode sn;

您将使用:

struct stackNode sn;

改为:

StackNodePtr snp;

您需要使用:

struct stackNode *snp;

声明完全相同。

typedef struct stackNode StackNode; 将会是 struct stackNode StackNode 吗?而 typedef StackNode *StackNodePtr; 将会是 struct stackNode *StackNodePtr;,我是对的吗? - Kyel John M David Philippines
请记住:使用typedef时,您只是创建/定义/重命名新的类型,而不是新的变量。 - Pablo Santa Cruz
@PabloSantaCruz 新类型 names,而不是。 - Quentin

7

另一种常见的写法是:

typedef struct stackNode
{
  int data;
  struct stackNode *nxtptr;

} StackNode_t;

其中,stackNode是所谓的“结构体标记”,而StackNode_t是类型的实际名称。如果您像这样声明结构体,则程序的其余部分不需要关注结构体标记,您可以像使用StackNode_t一样使用nxtptr


2
typedef struct stackNode
{
  int data;
  struct stackNode *nxtptr;

} StackNode_t;

如果您不想在结构体内部使用“struct stackNode”,我找到了一个方法:

typedef struct STACKNODE STACKNODE;
typedef struct STACKNODE
{
  int data;
  STACKNODE *nxtptr;
};

你可以编写这样的代码,它编译得很好,也可以运行得很好,这可能看起来有些违反直觉。这是因为我在结构体STACKNODE和typedef STACKNODE中使用了相同的名称。此外,在结构体定义之前,我对结构体进行了typedef处理。尽管如此,我发现我可以在Microsoft的C语言中以及Borland C语言(很久以前)中使用这种方式。
我喜欢这种方式,因为如果我已经要对结构体进行typedef处理,我不想在结构体定义内部使用"struct STACKNODE *nxtptr"(即使用"struct"这个单词)。

我认为这就是我发现的使用typedef与链表的两种选择。+1 - Cory Gross
你不应该使用没有名称的 typedef,所以第二个语句应该只是 struct STACKNODE { … };(省略 typedef)。目前,你有一个空洞的 typedef,一些编译器会对此发出警告。个人而言,我不会使用全大写字母作为名称;我将全大写字母保留给宏和枚举常量。 - Jonathan Leffler

1

使用typedef,您可以将StackNode定义为struct stackNode,并将指针StackNodePtr定义为StackNode

那么有什么不清楚的吗?


1

好的,简单来解释,typedef 的作用基本上只是告诉编译器你创建了一种新类型的变量(例如 int、char 等)。

使用 typedef 的主要原因是:

  • 助记符名称。这在库函数中经常使用。而不是使用标准类型如 int 或 long,你可以将其 typedef 为 size_t。这样就更清楚该变量用于什么目的了。
  • 缩短名称。通常用于结构体之类的东西(这将是你的情况)。为了避免总是需要键入 struct myStruct varname,你可以轻松地使用 typedef 来摆脱前面的 struct。

0

看看 typedef 是否有帮助。更像是101。标记为“使用注意事项”的部分可能会对您的关注点提供一些见解。


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