首页 > 解决方案 > C中的结构指针继承?

问题描述

最近我开始研究一些操作系统的源代码,有一种特殊的编码技术让我很困惑。

首先源代码声明了一个非常基本的结构体,例如:

struct cmd {
   int type;
};

然后,它继续声明其他几个结构,这些结构在其开头包含第一个基本结构:

struct execcmd {
  int type; //Here.
  char *argv[MAXARGS];
  char *eargv[MAXARGS];
};

struct redircmd {
  int type; //Here.
  struct cmd *cmd;
  char *file;
  char *efile;
  int mode;
  int fd;
};

因为这些结构的前几个字节中的标识,我们能够访问共享int type部分,即使我们不确定它到底是哪个结构。我们可以使用该int type部分将结构指针转换为正确的指针:

void runcmd(struct cmd *cmd)
{
  switch(cmd->type){
  case EXEC:
    ecmd = (struct execcmd*)cmd;

  case REDIR:
    rcmd = (struct redircmd*)cmd;
    break;

  case LIST:
    lcmd = (struct listcmd*)cmd;
    break;

  case PIPE:
    pcmd = (struct pipecmd*)cmd;
    break;

  case BACK:
    bcmd = (struct backcmd*)cmd;
    break;
  }

所以我的问题是,这种技术的名称和好处是什么,或者,这种技术的正常用例是什么?

标签: coperating-system

解决方案


这被称为“公共初始序列”。根据6.5.2.3 结构和工会成员,C11 标准的第 6 段

一个特殊的保证是为了简化联合的使用:如果一个联合包含多个共享一个公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许检查公共它们中的任何一个的初始部分,在任何地方都可以看到已完成联合类型的声明。如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(并且对于位域,具有相同的宽度),则两个结构共享一个共同的初始序列。

严格来说,您发布的代码是不正确的,因为struct成员不是通过共同工会使用的。


推荐阅读