我看过许多由以下 struct 组成的程序

typedef struct 
{
    int i;
    char k;
} elem;

elem user;

为什么经常需要它?有什么具体原因或适用范围吗?

推荐答案

正如Greg Hewgill所说,tyecif意味着您不再需要到处写struct.这不仅节省了击键次数,而且还可以使代码变得更干净,因为它提供了稍微更抽象的东西.

比如

typedef struct {
  int x, y;
} Point;

Point point_new(int x, int y)
{
  Point a;
  a.x = x;
  a.y = y;
  return a;
}

当你不需要到处看到"struct"关键字时,它看起来更像是你的语言中真的有一种叫做"Point"的类型.typedef岁之后,我想情况就是这样.

还要注意,虽然您的示例(和我的示例)省略了对struct本身的命名,但当您想要提供不透明类型时,实际命名它也很有用.然后,您在标题中会有如下代码,例如:

typedef struct Point Point;

Point * point_new(int x, int y);

然后在实现文件中提供struct定义:

struct Point
{
  int x, y;
};

Point * point_new(int x, int y)
{
  Point *p;
  if((p = malloc(sizeof *p)) != NULL)
  {
    p->x = x;
    p->y = y;
  }
  return p;
}

在后一种情况下,您不能返回Point by值,因为它的定义对头文件的用户是隐藏的.例如,这是一种在GTK+中广泛使用的技术.

UPDATE请注意,在一些备受推崇的C项目中,使用typedef来隐藏struct被认为是一个坏主意,Linux内核可能是此类项目中最知名的.关于莱纳斯的愤怒言辞,请参阅第The Linux Kernel CodingStyle document章第5章.:)我的观点是,问题中的"应该"可能毕竟不是一成不变的.

C++相关问答推荐

新的memaligning函数有什么用?

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

想了解 struct 指针和空指针转换

理解没有返回语句的递归C函数的行为

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

如何在C中从函数返回指向数组的指针?

特定闪存扇区的内存别名

为什么内核使用扩展到前后相同的宏定义?

Setenv在c编程中的用法?

Square不与Raylib一起移动

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

如何将另一个数组添加到集合中,特别是字符串?

接受任何参数的函数指针是否与接受不同参数的函数兼容

可变宏不能编译

为什么我在C代码中得到一个不完整的类型?

为什么会出现此错误?二进制表达式的操作数无效

如何在C中计算包含递增和递减运算符的逻辑表达式?

在分配内存后使用指针是未定义的行为吗?

这些表达式是否涉及 C 中定义的复合文字?

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果