C语言利用结构体封装函数API | 您所在的位置:网站首页 › c语言程序封装 › C语言利用结构体封装函数API |
结构体简述
C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。例如,在校学生有姓名、年龄、身高、成绩等属性,学了结构体后,我们就不需要再定义多个变量了,将它们都放到结构体中即可,如图所示: 那么我们怎么用C语言的结构体来封装函数API呢? 首先看看C++和C的区别及方法: C++类C++语言类中可以封装函数,体现了模块操做的整体性,下面代码便是C++语言对某个函数的封装,这样操作便于调用。 lass 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语言是否可以实现这种方式呢?C语言结构体不能直接封装函数,但可以通过封装函数指针的方式来实现,具体方法如下: 首先看看结构体的基本使用及定义方法,也就是上面所说的定义不同的数据类型,如下所示: typedef struct { uint8_t uart1; uint32_t uart2; uint8_t uart3; uint8_t uart4; uint16_t channel; }serial_t;函数封装方法如下,首先比如我们有如下几个函数 void hs_register_usart_callback(uint8_t usart_x,void (*ptr)(uint8_t*,uint16_t),uint16_t BuffSize,uint8_t reMode); void usart_config(uint8_t usart_x,uint32_t baud_rate); void hs_usart_printf(uint8_t usart_x, const char *Data,...); void hs_usart_sendHex(uint8_t usart_x,uint8_t *data,uint16_t len);那么要想封装这结果函数,结构体封装就如下所示(其中函数指针名称可自定义): ypedef struct { uint8_t uart1; uint8_t uart2; uint8_t uart3; uint8_t uart4; uint8_t channel;//自定义数据 void (*config)(uint8_t usart_x,uint32_t baud_rate); void (*register_callback)(uint8_t usart_x,void (*ptr)(uint8_t*,uint16_t),uint16_t BuffSize,uint8_t reMode); void (*print)(uint8_t usart_x, const char *Data,...); void (*sendHex)(uint8_t usart_x,uint8_t *data,uint16_t len); }serial_t;/*API 操作结构体*/然后申明一下就可以了,如下: serial_t serial;然后在名称后面加一点就可以调用对应的函数了。如下图所示: 这里也就是对结构体取个别名,然后在里面进行对应的赋值和定义,这里“.”后面的名字要和结构体里面“*”后面的一一对应。而”=”后面就是对应底层的函数名称,而uart1这几个直接赋的值,因为他们是结构体内的变量,后面直接调用serial.uart1,就等于是直接赋值0. 而函数的封装,这里就相当于起一个链接的作用,将结构体内和函数链接起来,我的理解是这样。 --------------------------------------------------------ENDFILE--------------------------------------------------- |
CopyRight 2018-2019 实验室设备网 版权所有 |