gpt4 book ai didi

c - C 中这两种 typedef 样式之间有什么区别?

转载 作者:太空狗 更新时间:2023-10-30 03:21:26 26 4
gpt4 key购买 nike

我很好奇在对枚举或结构进行类型定义时这里有什么区别。这两个 block 在语义上有什么区别吗?

这个:

typedef enum { first, second, third } SomeEnum;

还有这个:

enum SomeEnum { first, second, third };
typedef enum SomeEnum SomeEnum;

同样适用于结构。我见过两者都在使用,而且它们似乎都在 C 或 Objective-C 中做同样的事情。是否存在真正的区别,或者只是您可以使用哪种样式的偏好?

最佳答案

不同之处在于,第二种方法声明了一个名为 enum SomeEnum 的类型,还声明了一个 typedef-name SomeEnum - 该类型的别名。它实际上可以组合成等效的一行

typedef enum SomeEnum { first, second, third } SomeEnum;

很明显,这两种方法之间的唯一区别是 enum 关键字后是否有名称。使用第二种方法,您可以使用 SomeEnum eenum SomeEnum e 来声明该枚举类型的对象,无论您喜欢哪个。

第一种方法仅为原始匿名枚举类型声明 typedef-name SomeEnum,这意味着您仅限于 SomeEnum e 声明。

因此,只要您在声明中只使用 typedef-name SomeEnum,两者就没有区别。但是,在某些情况下,您可能必须使用 enum SomeEnum 类型的完整原始名称。在第一种方法中,该名称不可用,所以你会倒霉。

例如,如果在上述声明之后您还在某个嵌套范围内声明了一个名为 SomeEnum 的变量

int SomeEnum;

变量的名称将隐藏枚举的 typedef 名称,从而使该声明非法

SomeEnum e; /* ERROR: `SomeEnum` is not a type */

但是,如果您在声明枚举时使用了第二种方法,则可以通过使用完整的类型名称来解决此问题

enum SomeEnum e; /* OK */

如果您在声明枚举类型时使用第一种方法,这是不可能的。

当与结构一起使用时,struct 之后的名称在您需要自引用类型(包含指向同一类型的指针的类型)时是必须的,例如

typedef struct SomeStruct {
struct SomeStruct *next;
} SomeStruct;

最后,在第二种方法中,typedef 名称是完全可选的。你可以简单地声明

enum SomeEnum { first, second, third };

每次需要引用此类型时,只需使用enum SomeEnum即可。

关于c - C 中这两种 typedef 样式之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3190395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com