简短问题
在C中使用structs
和enums
的typedef是否有正确或首选的方法?
背景
我一直致力于一个代码库,有几个人/公司正在研究它,我遇到了typedefs
的不同实现。根据{{3}},他们似乎都具有相同的功能。我想我试图了解它们之间是否存在明显的差异或陷阱。相同的用法和问题适用于typedef
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;
答案 0 :(得分:1)
它们基本相同,因为它们都将obj_t
定义为结构的类型别名。
不同之处在于,当您定义结构的名称(例如struct obj ...
)时,您可以 使用struct obj myStructure;
如果您想要引用它内部的结构(例如创建链表时)。如果在实际结构之前执行typedef
(如第一个示例中所示),那么您当然也可以在结构中使用typedef名称。
答案 1 :(得分:1)
你的声明之间的另一个细微差别是版本2到3.在3中,你使用了一个未命名结构的typedef,当你要将它强制转换为2时,它会给你一个隐式的强制转换错误。
答案 2 :(得分: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,因为结构没有名称。因此,您无法在结构中声明此类型的变量。
答案 3 :(得分:0)
我不会回答你的问题,而是建议考虑Linux kernel coding style对typedef问题的看法。请参阅“第5章:Typedef”。摘录:
请不要使用“vps_t”之类的内容。
错误将typedef用于结构和指针。当你看到
vps_t a;
在来源中,它是什么意思?
相反,如果它说
struct virtual_container * a;
你实际上可以说出“a”是什么。
很多人认为typedef“有助于提高可读性”。不是这样。
继续阅读建议的例外情况。
答案 4 :(得分:0)
所有给出的类型定义结构的例子通知相同的事情。目前人们都遵循这一切,因为雇主的风格指南或客户特定的编码风格。你已经给出了所有可能的结构类型所以我添加仅ENUM您要求的内容
typedef enum season_t { SPRING, SUMMER, FALL, WINTER } Season;
如需更多标准答案,您可以查看下面给出的链接 http://www.montefiore.ulg.ac.be/~piater/Cours/Coding-Style/