【问题标题】:Structures with typedef [duplicate]具有 typedef 的结构 [重复]
【发布时间】:2012-08-21 04:05:10
【问题描述】:

可能重复:
Purpose of struct, typedef struct, in C++
typedef struct vs struct definitions

我知道在 C 中声明结构有两种方式

struct point{
    int x, y;
};

和:

typedef struct{
    int x, y;
} point;

但是这两种方法有什么区别,我什么时候使用 typedef 方法而不是其他方法?

【问题讨论】:

    标签: c struct typedef


    【解决方案1】:

    只有一种方法可以在C 中声明struct,使用struct 关键字,可选地后跟结构名称,然后是大括号中的成员字段列表。所以你可以:

      struct point_st {
         int x, y;
      };
    

    这里的point_st 是您的结构的名称(或标签)。请注意,结构名称在 C 中的命名空间与类型不同(这在 C++ 中不同)。所以我有如上图在结构名后加_st的习惯。

    您可以(独立地)使用 typedef 定义类型名称,例如

      typedef struct point_st Point;
    

    (您可以在任何 C 类型上使用 typedef,顺便说一句)。

    例如 Gtk 和 Glib 有很多不透明的类型,它们就是这样的不透明结构;只有实现知道并关心结构成员。

    当然编译器需要知道结构的字段来分配它;但如果您只使用指向不透明结构的指针,则无需声明该结构(即大括号中的字段)。

    【讨论】:

      【解决方案2】:

      对于第一种形式,变量声明必须是:

      struct point A;
      

      第二种形式允许声明没有structlike的变量

      point B;
      

      【讨论】:

        【解决方案3】:

        区别:

        1. 第一个是有效的C89;
        2. 第一个不会使结构的标签(“point”)成为完整的类型定义,因此您只能将point p; 与第二个一起使用。
        3. 我们的 C 编程之神 Linus Torvalds 强烈建议不要对结构使用 typedef(除非明确需要将实际字段和类型隐藏在不透明的结构后面),因为它会降低可读性。李>

        【讨论】:

        • 您有strongly encourages not using typedefs for structs 部分的参考/链接吗? . . .另一个是Our C programming God, Linus Torvalds? . . .
        猜你喜欢
        • 2021-10-04
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多