我曾经看过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;

第一个声明是untypedefstruct的声明,需要使用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/

10-16 07:31