利用C语言结构体封装函数
点击下方“程序员编程基地”,一起进步!
重磅干货,第一时间送达
来源:程序员编程基地
C++语言类中可以封装函数,体现了模块操做的整体性,封装后的函数可以完成自己独特的功能,每个函数提供给你一个接口,使用者只需要通过这个接口传入合法的数值便可以得到想要的结果。
函数封装具有保护性
函数体内的变量是受到这个函数保护的,这个函数外的函数想要使用该函数内的变量一般情况下是使用不了的,从而提高了该函数的稳定性。
下面代码便是C++语言对串口函数的封装,这样操作便于调用。
class MarlinSerial //: public Stream
{
public:
MarlinSerial();
void begin(long);
void end();
int peek(void);
int read(void);
void flush(void);
}
调用方法:
MarlinSerial MSerial; //实例化一个对象
MSerial.begin(9600);//设置串口的波特率为9600
这样便实现了串口的初始化。对串口操作函数进行了模块化封装,代码结构清晰。那么C语言是否可以实现这种方式呢?
这个最简单了,C语言中虽然没有类,但有struct。这可是个好东西。我们可以在一个struct中存入数据和函数指针,以此来模拟类行为。
typedef struct _Parent
{
int a;
int b;
void (*print)(struct _Parent *This);
}Parent;
1
2
3
4
5
6
7
8
9
C语言结构体不能直接封装函数,但可以通过封装函数指针的方式来实现,下面便是我实现的具体方式,可以很方便的移植到任何编译器上测试。
serial.c文件
/* serial.h文件 */
//定义封装函数的结构体,并声明外部引用
//对串口操作函数封装。
typedef struct
{
void begin(long);
void end();
int (*peek)();
uint8_t (*read)(void);
void (*flash)();
int (*availiable)();
void (*checkRx)();
}MarlinSerial;
extern MarlinSerial MSerial;
serial.c文件
MarlinSerial MSerial; //定义MarlinSerial类型的结构体MSerial
Serial_Init()
{
MSerial.read = &Serial_Read;
}
uint8_t Serial_Read(void)
{
printf("hello word!"); //在这里仅作测试所用,未列出真正的串口读取函数
}
/* main.c文件 */
int main(void)
{
Serial_Init();
MSerial.read(); //调用串口读取函数,目前功能为打印字符串
while(1)
{
//
}
}
C语言类的封装?没错,就是C,而不是什么C++、C#的类的封装!
说到封装这个面向对象的基本特征,那么有必要一起谈一谈面向对象和封装这两个概念和关系。
1、面向对象(Object Oriented,OO)是软件开发方法。
面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
简单的说,面向对象是一种思想,而编程语言是实现面向对象这种思想的工具和方法。
2、面向对象和封装的关系
面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。
封装是保证软件部件具有优良的模块性的基础,对象是封装的最基本单位。封装防止了程序相互依赖而带来的变动影响。
程序员编程基地
为大家提供与Python相关的编程学习基地
长按指纹 > 识别图中二维码 > 添加关注
觉得不错,点个“在看”然后转发出去