Gcc 为什么C中的结构或联合的sizeof需要变量?

Gcc 为什么C中的结构或联合的sizeof需要变量?,gcc,struct,union,sizeof,Gcc,Struct,Union,Sizeof,无法编译下面的代码。上面说这个人和u_类型是未声明的。如果我在sizeof中使用一个变量,就可以了。那么为什么需要sizeof中的变量呢。表示sizeof运算符可以与类型和表达式一起使用 谢谢 struct person { int age; char *name; }; union u_type { int t_int; double t_double; }; int main(void) { printf("size of person is %d\n", sizeo

无法编译下面的代码。上面说这个人和u_类型是未声明的。如果我在sizeof中使用一个变量,就可以了。那么为什么需要sizeof中的变量呢。表示sizeof运算符可以与类型和表达式一起使用

谢谢

struct person {
  int age;
  char *name;
};

union u_type {
  int t_int;
  double t_double;
};

int main(void) {
  printf("size of person is %d\n", sizeof(person));
  printf("size of u_type is %d\n", sizeof(u_type));
  return 0;
}

这是因为sizeof操作符需要一些它可以知道其大小的东西。
如果它是空的,它将没有任何内容可以查看和生成答案,但是由于您在程序中使用它时没有传递任何参数,因此它将给出一个错误,因为如果您理解的话,sizeof empty有点模糊。

您的程序中没有称为person或u\u type的内容。当然您有struct person和union u_类型,但是没有typedef让您只使用person和u_类型

试试sizeofstruct person

回答评论中的问题:

结构人{…};为您提供一个类型:struct person-其中person是一个标记。您需要使用struct person来使用该类型。在这种情况下,sizeofstruct person

结构{…}人;提供一个名为person的变量,该变量是一个结构,但不能重用该类型。在这种情况下,SizeOfferson


最常见的用法是typedef struct{…}Person,它为您提供了一个类型Person——与第一种情况非常相似,但是您可以使用Person而不是struct Person。在这种情况下,sizeofPerson

person和u_type不是类型。那么它们是什么呢?person是一个标记。我读了一些教程和书籍,它们说person是一个标记名,在声明struct时它是可选的。因此,在声明变量时,必须使用完整的struct person var_name编写。然而,你知道任何官方文件,比如说语言规范,说person什么都不是,struct person是一个类型吗?@Linh语言标准说person是一个标记名。它并没有说人什么都不是。标记名不是类型,但标准没有明确说明这一点。它主要说的是事物是什么,而不是事物不是什么。