我曾经看过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;
第一个声明是un
typedef
和struct
的声明,需要使用struct
关键字。第二个是typedef
ed匿名struct
,因此我们使用typedef
名称。第三个结合了第一个和第二个:您的示例使用baz
(通常很短),但也可以很容易地使用struct _baz
达到相同的效果。更新:larsmans' answer提到了一个更常见的情况,您必须至少使用
struct x { }
来创建链接列表。第二种情况在这里是不可能的(除非您放弃理智,而是使用void *
),因为struct
是匿名的,并且直到定义了typedef
为止,struct
才会发生,因此您无法进行(类型安全) )指向struct
类型本身的指针。第一个版本可以很好地用于此用途,但是根据我的经验,第三个版本通常是首选。为此给他一些代表。更细微的区别是 namespace 的放置。在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/