C - 这两个结构声明之间有什么区别?

时间:2011-07-25 21:43:37

标签: c struct

typedef struct hash_table_data
{
  int key;
  int data;
  struct hash_table_data* next;
  struct hash_table_data* prev;
}hash_table_data;

typedef struct hash_table
{
  int num_entries;
  struct hash_table **entries;
}hash_table;

VERSUS

struct hash_table_data_
{
  int key,data;
  struct hash_table_data_ *next,*prev;
};
typedef struct hash_table_data_ hash_table_data;

struct hash_table_
{
  int num_entries;
  struct hash_table_data_ **entries;
};
typedef struct hash_table_ hash_table;

5 个答案:

答案 0 :(得分:2)

在第二个示例中,您还有一个额外的名称:struct hash_table_data_struct hash_table_

在第一个示例中,您有效地使用typedef隐藏名称struct hash_table_data,该类型将struct hash_table_data重命名为较短的hash_table_data

这样想:

typedef (something that happens to be struct X) (to) X

VS

define a struct X
typedef struct X (to) X

现在在后一个例子中,你实际上并没有完全按照前一个例子所做的那样做。在后一个例子中,你做

define a struct X_
typedef struct X_ (to) X

这里的关键是你有一个可以直接使用的“额外”结构X_。

答案 1 :(得分:2)

实际上没有任何一个。 (删除链接,因为有些人无法在上下文中阅读。)

答案 2 :(得分:1)

唯一的区别是,在第一个示例中,结构的标记名称与typedef名称相同,而在第二个示例中,它们略有不同(它们具有尾随下划线)。

由于struct标签名称位于不同的名称空间中,因此typedef名称不需要不同(或相同)。有关其他详细信息,请参阅C style struct declaration

作为一种风格问题,我更喜欢我的成员声明为一行(如第一个例子中所示),但这完全是一种风格偏好;对结构没有任何影响。

答案 3 :(得分:0)

他们只是两种不同的方式来获得相同的结果。

答案 4 :(得分:0)

第一个更短。除此之外,它们是相同的。