使用匿名结构与使用typedef的命名结构

Joe*_*Joe 20 c

何时应该使用以下陈述之一?

typedef struct Foo {
    int a;
} Bar;
Run Code Online (Sandbox Code Playgroud)

typedef struct {
    int a;
} Bar;
Run Code Online (Sandbox Code Playgroud)

并使用它

Bar bar1 = { 5 };
Run Code Online (Sandbox Code Playgroud)

我理解第二个是匿名结构但不确定何时应该使用另一个结构.

klu*_*utt 17

它们非常相同.实际上,您可以在两个地方使用相同的名称.你应该.使用相同的名称,除非你有充分的理由不这样做.

您希望非匿名的一种情况是,您希望指向相同类型的对象,例如链接列表.

typedef struct Node {
    struct Node* next;
    int data;
} Node;
Run Code Online (Sandbox Code Playgroud)

一种选择:

typedef struct Node Node;

struct Node {
    Node * next;
    int data;
};
Run Code Online (Sandbox Code Playgroud)


dbu*_*ush 6

有一次需要前者是你要制作一个链表:

typedef struct list {
    int data;
    struct list *next;
} list;
Run Code Online (Sandbox Code Playgroud)

typedef list在struct定义中是不可见的,因此您需要使用实际的struct name来创建指向它的指针.

如果您没有这样的结构,可以使用其中任何一种.

但是,您不应该使用以下划线开头的标记名称,即:

typedef struct _list {
    int data;
    struct list *next;
} list;
Run Code Online (Sandbox Code Playgroud)

因为实现保留了以下划线开头的名称.

  • 它更复杂,但是绝不以下划线开头或使用连续的下划线是一个很好的经验法则。 (2认同)

PSk*_*cik 5

这并不重要.如果您使用标记的表单,您可以指向struct Foo内部struct Foo(AKA栏)

typedef struct Foo{
  int a;
  struct Foo *foop;
} Bar;
Run Code Online (Sandbox Code Playgroud)

但是第二种形式没有办法做到这一点

typedef struct {
  int a;
  //Baz *p; not valid here since Baz isn't a typename yet
} Baz;
Run Code Online (Sandbox Code Playgroud)

有些代码库根本不喜欢使用typedefs,而只是struct Foo每次都使用struct关键字进行拼写.

此外,对于第一种形式,您可以通过tag(struct Foo)或with typedefs(Bar或任何future/previous typedefs(typedef struct Foo PreviousTypedef;在提供定义之前可以执行)来引用类型.

另一方面,使用第二种形式,您只能使用Baz typedef和未来可能的typedefs(您不能转发typedef结构,因为它没有标记).

(注意,typedef并没有真正定义C中的类型.struct optional_tag { /*...*/ }部分确实如此.相反,typedef提供类型别名(所以它可能应该被命名typealias).)


Ber*_*ann 5

术语匿名结构已用于其他用途:在根本没有名称且其字段被引用为就好像它们是父项中的条目的嵌套结构(或联合)中。

关于何时使用一个或另一个的实际问题是,如果您想在其中添加指向其自身类型的指针,则必须使用第一种形式,如下所示:

typedef struct Foo { struct Foo* Child; ... } Foo;
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢使用像这样的 typedef 来做到这一点:

typedef struct Foo Foo;
struct Foo {Foo* Child;};
Run Code Online (Sandbox Code Playgroud)