我以前见过几种不同的C结构声明方式。为什么会这样,如果有的话,每种方法有什么不同?
例如:
struct foo {
short a;
int b;
float c;
};
typedef struct {
short d;
int e;
float f;
} bar;
typedef struct _baz {
short a;
int b;
float c;
} baz;
int main (int argc, char const *argv[])
{
struct foo a;
bar b;
baz c;
return 0;
}
4条答案
按热度按时间rjjhvcjd1#
那么,明显的区别在
main
中得到了证明:第一个声明是un-
typedef
艾德struct
,需要使用struct
关键字。第二个是typedef
艾德匿名struct
,因此我们使用typedef
名称。第三个结合了第一个和第二个:您的示例使用了baz
(这是方便的短),但可以轻松地使用struct _baz
达到相同的效果。更新:larsmans的回答提到了一个更常见的情况,你必须至少使用
struct x { }
来创建一个链表。第二种情况在这里是不可能的(除非你放弃理智而使用void *
),因为struct
是匿名的,而typedef
在struct
被定义之前不会发生,所以你没有办法创建一个指向struct
类型本身的(类型安全的)指针。第一个版本对于这种使用效果很好,但根据我的经验,第三个版本通常是首选的。给予他点面子。一个更微妙的区别是名称空间的位置。在C语言中,
struct
标记被放置在与其他名称不同的命名空间中,但typedef
名称则不是。以下是法律的的:但下面的例子不是,因为
test
的名称是不明确的:typedef
使名称更短(总是一个加号),但它将其放在与变量和函数相同的命名空间中。通常这不是一个问题,但这是一个微妙的区别,超出了简单的缩短。wbgh16ku2#
这主要是个人喜好的问题。我喜欢给新类型起一个以大写字母开头的名字,并省略
struct
,所以我通常写typedef struct { ... } Foo
。这意味着我不能写struct Foo
。例外情况是当
struct
包含指向其自身类型的指针时,例如在这种情况下,您还需要声明
struct Node
类型,因为typedef
不在struct
定义的范围内。请注意,这两个名称可能相同(我不确定下划线约定起源于何处,但我猜旧的C编译器无法处理typedef struct X X;
)。dsekswqp3#
你所有的用法在语法上都是正确的。我更喜欢下面的用法
注意,这很容易允许在
struct
本身的声明中使用typedef
,甚至对于相互引用的struct
。ztmd8pv54#
之所以会产生混淆,是因为一些声明实际上声明了多达三个C结构。您需要记住以下两者之间的区别:
1.结构定义,以及
1.结构声明。
它们都是非常不同的C结构。他们都做不同的事情;但是如果你愿意的话,你可以把它们组合成一个复合结构。
让我们依次查看每个声明。
这里我们使用最基本的结构定义语法。我们正在定义一个C类型,并在tag命名空间中将其命名为
foo
。以后可以使用以下语法声明该类型的变量:下一个声明在global命名空间中为类型提供了另一个名称(别名)。让我们使用前面的基本声明将其分解为组件。
现在只需将“foo”替换为结构体的定义,瞧!
上面的语法等价于下面的声明序列。