首页 > 其他分享 >c语言实现this指针效果

c语言实现this指针效果

时间:2023-12-04 10:14:36浏览次数:31  
标签:TypeDef LED 语言 效果 UART void BSP struct 指针

概要

由于目前在做一个比较复杂的嵌入式项目,想要借此提升一下代码的结构设计能力,所以想要以面向对象的思想来完成这个项目,即把每个板载外设资源视为一个对象,采用msp+bsp的模式,对每个bsp外设实现对象化处理,现有方案需要手动传入对象引用,调用方法时比较麻烦,所以考虑简化调用方式。

面向对象实现思路

现有方案

对象就是具有属性与方法的集合体,以LED举例,它的属性就是端口引脚亮使能标志等,方法就是
了解到现有的c语言面向对象实现方法都需要手动传入对象的引用,如下这种方式:

typedef struct _LED_TYPEDEF{
	//属性
	struct _Privated_Attr{
		GPIO_InitTypeDef GPIO_Body;
		GPIO_TypeDef *GPIOx;
		GPIO_PinState ENbit;
	} Privated_Attr; 
	
	//方法
	void (*LightUp)(struct _LED_TYPEDEF *);
	void (*LightOff)(struct _LED_TYPEDEF *);
}LED_TypeDef;

上面的结构体中有一个嵌入的结构体变量,主要用途就是类似私有变量,类外不可直接访问的目的,也是出于属性只由方法操作,这样可以对属性值的合理性做出一定限制与约束,然后方法的参数必须加入对象的引用,也就是传入对象地址。
此时调用方法为:

//实例化对象
LED_TypeDef BSP_LED1;
LED_TypeDef BSP_LED2;

//对象方法使用
BSP_LED1.LightUp(&BSP_LED1); //led1亮
BSP_LED2.LightOff(&BSP_LED2);//led2灭

这种方式比较麻烦,所以有必要引入c++this指针方式。

this方案

目的:为了简写对象方法的调用模式。
所谓的this指针可以简单理解为编译器帮我们把对象引用传递到方法中了。

单一bsp方案

此单一bsp意为板子上只有这一个外设,所以这个bsp对象只需要一个this指针,以uart举例

typedef struct _UART_OBJ_TYPEDEF{
	//属性
	struct _PrivateAttr{
		uint16_t Buf_Cnt;
		UART_HandleTypeDef UARTxHandler;		
	}PrivateAttr;
	uint8_t Is_RX_OV;
	uint8_t Is_RX_OK;
	uint8_t RX_Buf[UART_RX_MAX_SIZE];
	
	//方法
	void (*SendChar)(struct _UART_OBJ_TYPEDEF *,uint8_t chr);
	void (*SendStr)(struct _UART_OBJ_TYPEDEF *,uint8_t *str);
	void (*ClearBuf)(void);
	void (*ClearFlag)(void);
	void (*BufAppend)(uint8_t byte);
	uint16_t (*GetBufLength)(void);
}UART_Obj_TypeDef;

可以看到方法中不再需要手动传入对象引用了。

UART_Obj_TypeDef UART_Debug_Obj; //实例化对象
static UART_Obj_TypeDef *mthis = &UART_Debug_Obj; //this指针实现对象引用

这样就利用static文件的作用域实现为每个bsp对象实现一个this指针效果。

//将数据放入缓冲区
UART_Debug_Obj.BufAppend(res);
//清空缓冲区
UART_Debug_Obj.ClearBuf();

多个同类bsp方案

//bsp对象的this数组偏移量
#define BSP_LED1_OFFSET 0
#define BSP_LED2_OFFSET 1

//间接改变this的指向
#define BSP_LED1	(this_ledx = BSP_LED1_OFFSET);_BSP_LED1
#define BSP_LED2	(this_ledx = BSP_LED2_OFFSET);_BSP_LED2

struct _LED_TYPEDEF;

typedef struct _LED_TYPEDEF{
	struct _Privated_Attr{
		GPIO_InitTypeDef GPIO_Body;
		GPIO_TypeDef *GPIOx;
		GPIO_PinState ENbit;
	} Privated_Attr;
	void (*LightUp)(void);
	void (*LightOff)(void);
}LED_TypeDef;

使用宏定义的方式间接改变this的指向

//实例化2个同类对象
LED_TypeDef _BSP_LED1;
LED_TypeDef _BSP_LED2;
//this指针与this数组
static LED_TypeDef* This_Arr[LED_NUM] = {&_BSP_LED1,&_BSP_LED2};
static LED_TypeDef* mthis;
//this指向偏移量(因为外面要用,所以名字不要冲突,最好和bsp对象相关)
uint8_t this_ledx = BSP_LED1_OFFSET;
//方法定义
void LightUp(){
	mthis = This_Arr[this_ledx]; //通过this指针偏移来确定使用哪个对象
	HAL_GPIO_WritePin(mthis->Privated_Attr.GPIOx,\
	mthis->Privated_Attr.GPIO_Body.Pin,\
	mthis->Privated_Attr.ENbit);
}

总结

基于面向对象的思想对于代码的结构和可读性上都有一定的利处,特别在裸机编写过程中,由于不受系统的干预,对于思路与框架的设计都清晰起来,目前还在不断改善中,这种方式的缺陷也很明显,只适用在静态的情况,要想动态实现只有编译器能操作了,但还是希望这种方式可以很好的在项目中使用。

标签:TypeDef,LED,语言,效果,UART,void,BSP,struct,指针
From: https://www.cnblogs.com/pie-o/p/17874200.html

相关文章

  • 2.C语言和C++的几个标准(2023年12月4号)
    C语言和C++的区别C语言的设计理念:灵活、高效、性能极限C++的设计理念:面向对象为主 CPP:包含C语言(语法有微小差异)面向对象编程泛型编程STL标准模块库C++标准库 C语言是结构化语言:实例:我喜欢一个女孩C语言(......
  • 纯CSS实现炫酷背景霓虹灯文字效果
    如图所示,这是一个很炫酷的霓虹灯文字效果且背景炫酷,就像很多个灯光闪烁着不同的颜色。本次文章将解析如何用CSS代码实现这个效果,根据上面的动图分析出我们要实现的几个主要功能点:整个背景中有平均分布的小点衬托中心区域文字闪烁效果如同霓虹灯一样文字背景呈多个平均分布的......
  • C语言-动态内存管理(二)
    第二部分主要是常见的动态内存错误动态内存错误1.对NULL指针的解引用操作对NULL指针的解引用操作,什么意思呢?有些同学写代码的时候比较冲动,如下:intmain(){int*p=(int*)malloc(40);for(inti=0;i<10;++i){*(p+1)=i;}free(p);p=NULL;......
  • R语言中的偏最小二乘回归PLS-DA|附代码数据
    原文链接:http://tecdat.cn/?p=8890原文出处:拓端数据部落公众号最近我们被要求撰写关于偏最小二乘回归PLS-DA的研究报告,包括一些图形和统计输出。主成分回归(PCR)的方法本质上是使用第一个方法的普通最小二乘(OLS)拟合来自预测变量的主成分(PC)。这带来许多优点:预测变量的数量实际......
  • R语言Outliers异常值检测方法比较|附代码数据
    原文链接:http://tecdat.cn/?p=8502原文出处:拓端数据部落公众号最近我们被客户要求撰写关于异常值检测的研究报告,包括一些图形和统计输出。识别异常值的方法有很多种,R中有很多不同的方法。 关于异常值方法的文章结合了理论和实践。理论一切都很好,但异常值是异常值,因为它们不遵......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • C++ 返回函数指针的函数
    目录0前言1FunctionPointerinC/C++type1.1ordinaryfunctionPointer1.2non-staticmemberfunctionofclass1.3LambdaToFunctionPointer1.4总结什么是指针2ReturningafunctionpointerfromafunctioninC/C++3.C-VariableArguments(Variablelengtharg......
  • 【C语言】自定义类型:联合和枚举
    1、联合体1.1、联合体类型的声明像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。#inclu......
  • 【C语言】浮点数在内存中的存储
    常⻅的浮点数:3.14159、1E10等,浮点数家族包括:float、double、longdouble类型。 浮点数表⽰的范围:float.h中定义我们先通过一道题目来了解:#include<stdio.h>intmain(){intn=9;float*pFloat=(float*)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",......
  • 《初学C语言第14天》
    ////结构体成员的访问//#include<stdio.h>//typedefstructstu//{// //成员变量// charname[20];// shortage;// chartele[12];// charsex[7];//}Stu;//voidPrint1(Stutmp)//形参tmp//形参是实参的一份临时拷贝,且此块空间放到其他的位置上即tmp位置上(存在空间浪费......