c - 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;
}
所以我的问题是,这种技术的名称和好处是什么,或者,这种技术的正常用例是什么?
解决方案
这被称为“公共初始序列”。根据6.5.2.3 结构和工会成员,C11 标准的第 6 段:
一个特殊的保证是为了简化联合的使用:如果一个联合包含多个共享一个公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许检查公共它们中的任何一个的初始部分,在任何地方都可以看到已完成联合类型的声明。如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(并且对于位域,具有相同的宽度),则两个结构共享一个共同的初始序列。
严格来说,您发布的代码是不正确的,因为struct
成员不是通过共同工会使用的。
推荐阅读
- android - 1小时间隔触发功能
- php - PHP - 错误后下拉列表变为空
- php - PHP中的动态层次递归输出
- spring-webflux - 添加重试WebClient的所有请求
- php - 编辑的 PHP 代码不反映到网页
- android - 使用导航组件时如何设置对话框的目标片段
- c - 我如何知道我的 args[] 字符串是否为 char 类型?
- powershell - 如何删除这些别名
- java - 当数组由我的类中的字段组成时,我应该在每个元素上使用 Objects.equals() 而不是 Arrays.equals() 吗?
- arduino - LoRa32 错误显示 BMP180 数据