2009-06-11 121 views
2

我正在使用这样的结构。我不喜欢typedef,因为我已经告诉它可以隐藏错误。 但是,我正在查看一些示例代码,并且我看到了像这样声明的结构。这是我声明它们的正常方式。使用这样声明结构的差异

struct person 
{ 
    int age; 
    char name[32]; 
}; 

struct person person_a; 
    person_a.age = 20; 
    etc. 

声明如下不过,我所看到的结构:

struct 
{ 
    int age; 
    char name[32]; 
}person; 

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

是所有这些的区别不同的技术,以及如何决定何时最好使用每一个特定的一个。

非常感谢您的任何建议,

+2

我很想知道为什么typedefs可以隐藏错误。我倾向于更喜欢typedefs - 至少因为你不能遇到使用'extern void func(struct something * xxx)'的问题;'没有事先声明“结构化”。也就是'extern void func(something * xxx)';'需要typedef来“编译”所有东西。替代编译 - 但没有做你期望的(尽管大体上,你会摆脱它)。 – 2009-06-11 04:32:51

回答

17

此:

struct 
{ 
    int age; 
    char name[32]; 
}person; 

声明一个变量,person这是一个structstruct没有名称,但仍以相同方式使用person变量。

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

这是相同的:

struct _person 
{ 
    int age; 
    char name[32]; 
}; 
struct _person person; 

它声明一个struct名为_person然后使一个称为struct _person类型的person变量。

1

没有什么神奇的,真的,

struct person 
{ 
    int age; 
    char name[32]; 
} var; 

是同一件事:

struct person 
{ 
    int age; 
    char name[32]; 
}; 
struct person var; 
1

的第一代码只是创建人结构。
第二个代码创建person结构person_a的一个实例。
第三个代码创建一个未命名的结构和一个名为person的实例。 第4个代码创建一个名为_person的结构和一个名为person的实例。

1

如果结构定义的目的是声明一个逻辑数据结构,这个结构在本地模块之外有意义,那么你会希望在头文件中看到第一个结构。

在现实世界的C代码中,结构经常被声明为范围局部的purley实用性原因。例如,格式化将被复制到缓冲区中的数据。在这些情况下,合并结构类型和变量声明非常方便且合乎逻辑。此外,对结构类型使用匿名声明可以避免使用不需要的名称混淆名称空间。

我确实对这些例子有一个批评:在C中,带有前导下划线的名字按照惯例被认为是为编译器供应商保留的。所以我认为最后一个例子不符合最佳实践。

2

在最后两个结构中,您都为称为person的结构分配了存储。

我的意思,如果你有这样的事情是:

struct person 
{ 
    int age; 
    char name[32]; 
}; 

这只是一个声明;没有变量分配,因此不能在代码中使用。您已声明后,可以按如下方式开始使用这样的结构:

struct person p1; 

然后,P1可以利用p1.age或p1.name等

在真实世界的代码方面,而不是

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

我们通常看到

typedef struct _person 
{ 
    int age; 
    char name[32]; 
} person_t; 

在这种情况下,我们可以节省打字更重要的是在S结构的行为与其他任何内置类型(如int等)相同。 例如,

person_t p1;

person_t * p1;

等等。

2

对于第一个例子(第二个例子),如果你确定你确实需要另一个对象用于这个结构,你将使用这种方法。这看起来干净,速度快的代码:)

因为你有一个现成的对象名为“人”的第二种情况和选项以后创建一个对象作为

struct _person object2 

这是解释为什么你将使用任一种方法。它们之间的区别已经在上面解释清楚了。