c - 声明 C 结构的语法正确方法是什么?

标签 c syntax struct

我以前见过 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 关键字。第二个是 typedefed 匿名 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/

相关文章:

X86 和 ARM 上 C 中指针和整数的比较

JavaScript 属性访问 : dot notation vs. 括号?

c - 何时在 C 中使用位域

c - 带循环的结构和内存分配

c - C语言工资单生成程序

C编程: Trying to print the reverse of the products of all the 2-digit numbers

c - Kconfig、宏和未定义的宏警告

regex - 用正则表达式语法解释大括号

c - 在函数定义之前添加全大写关键字是什么意思?

c - 嵌套类字符串结构中的嵌入与指针