首页 > 其他分享 >C语言接口编写

C语言接口编写

时间:2022-12-21 18:55:13浏览次数:58  
标签:system struct int 文件系统 接口 C语言 file interface 编写

C语言中,没有interface这个语法,因此上面的代码在C语言中,需要用struct 来实现。具体包括:

  1. 每个接口函数,需要声明一个单独的函数指针类型;
  2. 整个interface的方法集,用一个struct来表示,struct的成员为各个函数指针
  3. 每个文件系统的实现者,各自需要一个struct来表示,这个struct的类型对调用者不可见。各个文件系统有自己的struct结构,彼此互不相同,也互不可见。
  4. 接口的实现,包括两部分:1)接口函数的实现;2)文件系统的struct实例。这两部分放在一起,构成了接口的实现。我们用一个struct来把这两部分组合在一起。
  5. 由于各个文件系统的struct结构,对调用者不可见,因此文件系统用void*把自己的struct指针传递给调用者。

具体的代码实现,如下:(为了保持篇幅简洁,只列了open_file和read_file 两个方法)

//fs_interface.h
#ifndef FS_INTERFACE_H
#define FS_INTERFACE_H

// 接口函数指针类型
typedef int (*open_file_fn)(void* pfs, const char* path, int flags);
typedef int (*read_file_fn)(void* pfs, int fd, char* buf, int len);
// 接口方法集
typedef struct fs_methods_t {
        open_file_fn open_file;
        read_file_fn read_file;
} fs_methods_t;

// 接口的实现体
typedef struct file_system_interface {
        void* pfs;                              // 文件系统的具体实现struct
        fs_methods_t* pmethods; // 这个文件系统的具体接口方式实现
} file_system_interface;

// 各个文件系统,通过 register_file_system 将自己注册进内核
// const char* pname;           // 文件系统的名称,如ext2, xfs...
int register_file_system(const char* pname, file_system_interface fsi);

上面的代码中,有几个地方需要注意:
1)每个接口函数类型声明中,都比interface中的函数多了一个参数:void* pfs, 这个参数指向具体的文件系统的struct。
这样,内核才能真正对这个struct对象发起调用。
2)file_system_interface 是interface的具体实现体,里面包含2个指针:一个是指向文件系统实现体struct的指针pfs, 另一个指针指向文件系统实现的接口函数的集合。这样,interface就是一个简单的struct,可以像简单变量一样声明、赋值和参数传递,其按值拷贝传递即可,无需传指针引用。

参考

标签:system,struct,int,文件系统,接口,C语言,file,interface,编写
From: https://www.cnblogs.com/jeseesmith/p/16996944.html

相关文章

  • 基于ADS1299的可穿戴设备调试之接口含义简析
    前言  几个项目都用到了ADS1299,没想到中间会出那么多的问题。在解决问题的时候,这里面暴露了团队的不少不足之处。看来做技术,还是需要不断地积累。思维不能留盲......
  • Set接口-HashSet和LinkedHashSet
    1.Set接口1.1基本介绍1)无序(添加和取出的顺序不一致),没有索引;2)不允许重复元素,所以最多包含一个null;3)JDKAPI中Set接口的实现类有:1.2Set接口的常用方法和L......
  • C语言关键字和语句
    auto自动(变量类型前,一般省略了,例inta=0;其实int前就修饰了auto)break返回,一般用于循环和swith的结束,循环就直接跳出循环,case   swith语句里的判断,const 常量修饰......
  • C语言学习初识day1
    全局变量,局部变量:      放在大括号里的变量就是局部变量;全局变量生命周期是整个程序。当局部变量和全局变量辆重名时,局部变量优先。常量,变量,常变量:C语言中的常量分......
  • golang接口
    1.ConstrainedGenericTypepackagemainimport( "fmt")typeStringer=interface{String()string}typeIntegerintfunc(iInteger)String()str......
  • 判断接口是否支持跨域
    打开浏览器,右键,选择检查,选择console  输入测试代码,然后回车,正常返回即可跨域请求get请求varxhr=newXMLHttpRequest();xhr.open('GET','url');xhr.sen......
  • Go语言接口类型的合理使用
    dog:=Dog{"littlepig"}varpetPet=&dog我们声明并初始化一个Dog类型的变量dog,然后它的指针赋给类型为Pet的变量pet对于一个接口类型的变量来讲,如上面的变量pet......
  • Vue-router4.0接口快速识别
    Vue-router4.0接口快速识别<router-link> :将会被渲染a标签属性名属性类型属性作用tostring/object相当于跳转调用router.push(string/object)replacebo......
  • Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件
    Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件之前有提到过我们项目部现在正在用Qt重构一个大型软件,现在的情景是这样的:原先的软件是通过一个C++(CLR)的主程序,调......
  • 实现继承与接口继承区别
    实现继承通常情况下表现为对抽象类的继承,而其与接口继承在规则上有以下几点归纳:·抽象类适合于有族层概念的类间关系,而接口最适合为不同的类提供通用功能。·接口着重于C......