【问题标题】:Proper typedef syntax in CC中正确的typedef语法
【发布时间】:2013-05-14 10:18:51
【问题描述】:

小问题
是否有适当或首选的方式在 C 中使用 structsenums 的 typedef?

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

// 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;

【问题讨论】:

  • 根据this page,所有以_t 结尾的名称都是保留的,因此这可能不是最好的代码。

标签: c coding-style standards


【解决方案1】:

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

不同之处在于,当您定义结构的名称(例如struct obj ...)时,您可以使用struct obj myStructure;,如果您想自己引用其中的结构,则需要这样做(例如在创建链接列表时)。如果您在实际结构之前执行typedef(就像在您的第一个示例中一样),那么您当然也可以在结构中使用 typedef 的名称。

【讨论】:

  • 你的链表其实是我很久以来唯一一次使用第一种方法了。
【解决方案2】:

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

【讨论】:

  • 我没有考虑过那里的隐式转换。
【解决方案3】:
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,因为结构没有名字。因此,您不能在结构中声明这种类型的变量。

【讨论】:

    【解决方案4】:

    我不会回答你的问题,而是建议考虑 Linux kernel coding style 在 typedefs 问题上的看法。请参阅“第 5 章:Typedefs”。摘录:

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

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

    vps_t a;

    在源码中是什么意思?

    相反,如果它说

    struct virtual_container *a;

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

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

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

    【讨论】:

    • 读得好,有道理。但是我不太同意他们“可以分辨出'a'实际上是什么”。 Typedef 隐藏了 vps_t 是一个结构的事实,但并没有减轻检查标题或文档以了解如何使用 virtual_container 的需要。
    • @AdamLewis 是的,它没有多大帮助,但仍然提供了比“vps_t”更多的信息。
    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2015-03-09
      • 1970-01-01
      • 2017-07-15
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多