我以前见过 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;
}
最佳答案
好吧,明显的区别在您的 main
中展示:
struct foo a;
bar b;
baz c;
第一个声明是一个未被 typedef
编辑的 struct
并且需要使用 struct
关键字。第二个是 typedef
ed 匿名 struct
,因此我们使用 typedef
名称。第三个结合了第一个和第二个:您的示例使用 baz
(它很短)但可以很容易地使用 struct _baz
达到相同的效果。
更新:larsmans' answer提到了一个更常见的情况,您必须至少使用 struct x { }
来制作链表。第二种情况在这里是不可能的(除非你放弃理智并使用 void *
代替)因为 struct
是匿名的,而 typedef
在定义 struct
之前不会发生,因此您无法创建指向 struct
类型本身的(类型安全)指针。第一个版本适用于此用途,但根据我的经验,通常首选第三个版本。给他一些代表。
一个更微妙的区别是命名空间的放置。在 C 语言中,struct
标记与其他名称放在不同的命名空间中,但 typedef
名称不是。所以以下是合法的:
struct test {
// contents
};
struct test *test() {
// contents
}
但下面不是,因为名称 test
是什么会产生歧义:
typedef struct {
// contents
} test;
test *test() {
// contents
}
typedef
使名称更短(总是一个加号),但它将它放在与您的变量和函数相同的 namespace 中。通常这不是问题,但它是简单缩短之外的细微差别。
关于c - 声明 C 结构的语法正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698600/