0

简短的问题
是否有适当或首选的方式来使用 C 中的structs和类型定义enums

背景
我一直在研究一个代码库,该代码库有几个人/公司在研究它,我遇到了不同的typedefs. 根据维基百科,它们似乎都具有相同的功能。我想我想了解它们之间是否存在细微的差异或陷阱。相同的用法和问题适用于typedefing enum

// I tend to use this if I need to create an
// alias outside the defining module.

typedef struct obj obj_t;
struct obj
{
    UINT8 val;
};

// I started to use this format to alias objects
// within the same module (both private and
// public definitons).  This is also how 
// several colleagues use them.

typedef struct obj_t
{
    UINT8 val;
}obj_t;

// This is how I now typically format the aliases
// for both public and private definitions.

typedef struct
{
    UINT8 val;
}obj_t;

// I just ran into this one.  While makes sense 
// how it works, it wasn't inherently better or
// worse then the formats above. Note the different 
// container names.

typedef struct obj_t
{
    UINT8 val;
}obj;
4

5 回答 5

1
typedef struct obj obj_t;
struct obj
{
    UINT8 val;
};

之前编写 typedef 可以让您在结构内部使用它。

typedef struct obj_t
{
    UINT8 val;
}obj;

typedef struct obj_t
{
    UINT8 val;
}obj_t;

这两个用于当您需要使用“struct obj_t”或“obj_t”声明变量时。我更喜欢将 t_ 或 _t 用于 typedef(更明确),但这实际上只是编码风格问题,没有技术人员选择使用其中一个而不是另一个。

typedef struct
{
    UINT8 val;
}obj_t;

在这里您只能使用 typedef,因为该结构没有名称。因此,您不能在结构中声明这种类型的变量。

于 2013-05-14T11:39:51.813 回答
1

它们都基本相同,因为它们都定义obj_t为结构的类型别名。

不同之处在于,当您定义结构的名称(例如struct obj ...)时,您还可以使用struct obj myStructure;This is required if you want to reference the structure inside its self(例如在创建链表时)。如果您typedef在实际结构之前执行此操作(如在第一个示例中),那么您当然也可以在结构中使用 typedef 的名称。

于 2013-05-14T10:22:26.653 回答
1

声明之间的另一个细微差别是版本 2 到 3。在 3 中,您使用未命名结构的 typedef,当您要将其转换为 2 时,这会给您一个隐式转换错误。

于 2013-05-14T11:22:14.227 回答
0

我不会回答你的问题,而是建议考虑一下Linux 内核编码风格对 typedefs 的看法。请参阅“第 5 章:Typedefs”。摘抄:

请不要使用“vps_t”之类的东西。

将 typedef 用于结构和指针是错误的。当你看到一个

vps_t a;

在源代码中,它是什么意思?

相反,如果它说

结构 virtual_container *a;

您实际上可以说出“a”是什么。

很多人认为 typedef“有助于提高可读性”。不是这样。

请继续阅读建议的例外情况。

于 2013-05-14T10:29:05.473 回答
0

所有给定的 typedefing 结构的示例都说明了同样的事情。目前人们正在关注这一切,无论是因为雇主的风格指南还是客户特定的编码风格。你已经给出了所有可能的结构类型,所以我只添加你要求的 ENUM

typedef enum season_t { SPRING, SUMMER, FALL, WINTER } Season;

有关更多标准答案,您可以查看下面给出的链接 http://www.montefiore.ulg.ac.be/~piater/Cours/Coding-Style/

于 2013-05-14T10:34:23.557 回答