结构和打字[英] struct and typedef

本文是小编为大家收集整理的关于结构和打字的处理方法,想解了结构和打字的问题怎么解决?结构和打字问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

C?

中的以下等效词是等效的
// #1
struct myStruct {
    int id;
    char value;
};

typedef struct myStruct Foo;

// #2
typedef struct {
    int id;
    char value;
} Foo;

如果没有,我应该使用哪一个以及何时?

(是的,我已经看过 this this .)

推荐答案

不,它们并不完全等效.

在第一个版本中Foo是命名struct myStruct的TYPEDEF.

在第二版中,Foo是未命名struct的typedef.

尽管在许多情况下都可以以相同的方式使用两种Foo,但存在重要差异.特别是,第二个版本不允许使用前向声明声明Foo,而struct则是typedef,而第一个则是.

其他推荐答案

第二个选项无法引用本身.例如:

// Works:
struct LinkedListNode_ {
    void *value;
    struct LinkedListNode_ *next;
};

// Does not work:
typedef struct {
    void *value;
    LinkedListNode *next;
} LinkedListNode;

// Also Works:
typedef struct LinkedListNode_ {
    void *value;
    struct LinkedListNode_ *next;
} LinkedListNode;

其他推荐答案

第一个形式允许您在类型定义完成之前参考结构,因此您可以参考本身内的结构或具有相互依赖类型:

struct node {
  int value;  
  struct node *left;
  struct node *right;
};

typedef struct node Tree;

struct A;
struct B;

struct A {
  struct B *b;
};

struct B {
  struct A *a;
};

typedef struct A AType;
typedef struct B Btype;

您可以将两者结合起来:

typedef struct node {
  int value;
  struct node *left;
  struct node *right;
} Tree;

typedef struct A AType;  // You can create a typedef 
typedef struct B BType;  // for an incomplete type

struct A {
  BType *b;
};

struct B {
  AType *a;
};

本文地址:https://www.itbaoku.cn/post/359034.html