关于C#:使用typedef的结构

Structures with typedef

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Purpose of struct, typedef struct, in C++
typedef struct vs struct definitions

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

1
2
3
struct point{
    int x, y;
};

还有:

1
2
3
typedef struct{
    int x, y;
} point;

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


差异:

  • 第一个是有效的C89;
  • 第一个并没有使结构的标签("point")成为一个完整的类型定义,所以您只能将point p;与第二个一起使用。
  • 我们的C编程之神,LinusTorvalds强烈建议不要为结构使用typedef(除非明确需要隐藏实际字段和不透明结构后面的类型),因为它会降低可读性。

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

    1
    2
    3
      struct point_st {
         int x, y;
      };

    这里,point_st是结构的名称(或标记)。注意,结构名称在C中的命名空间与类型不同(C++中不同)。所以我习惯用上面所示的_st来后缀结构名。

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

    1
      typedef struct point_st Point;

    (您可以在任何C类型上使用typedef,btw)。

    例如,gtk和glib有许多不透明的类型,这些类型是不透明的结构;只有实现知道并关心结构成员。

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


    对于第一个窗体,变量声明必须是:

    1
    struct point A;

    第二种形式允许声明不带struct类型的变量

    1
    point B;