C语言中的正确typedef语法

时间:2013-05-14 10:18:52

标签: c coding-style standards

简短问题
在C中使用structsenums的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;

5 个答案:

答案 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/