2011-07-25 63 views
0
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; 

VERSUSC - 这两个结构声明有什么区别?

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; 
+0

这功课吗? – Suroot

+0

是不是第一个更好的风格? –

+0

在我看来(这是争论)后一个例子是更好的风格;因为它不会将结构定义与typedef混合在一起。但是,有很多人觉得其他方面同样强烈。修改或扩展其他代码时最好抛弃这些意见。做他们做的事。当从头开始编写自己的新代码时,这是唯一适合对这样的话题发表看法的时候。 –

回答

2

在第二个例子中,你必须在行动的额外名称:struct hash_table_data_struct hash_table_

在第一个例子,您可以有效地与重命名struct hash_table_data较短hash_table_data一个typedef隐藏名称struct 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_可以直接使用。

+0

他在两个名字都有。他必须将第一个示例更改为'typedef struct {...'from typedef struct hash_table_data {...'没有'struct hash_table_data'可用的名称 { – Paulpro

+0

他们是否实现完全相同的目标?如果我使用一个与另一个,会有区别吗? –

+0

啊,所以我有一些冗余......我可以删除第一个typedef结构hash_table_data或后面的括号中的hash_table_data ...? –

0

他们只是两种不同的方法具有相同的结果结束了。

0

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

2

实际上没有任何。 (已删除的链接,因为有些人无法读取上下文。)

1

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

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

作为一种风格,我更喜欢我的成员声明是一行代码(如第一个示例中那样),但这绝对是一种风格偏好;对结构没有任何影响。