侵权投诉

为什么要用C语言实现面向对象

strongerHuang 2020-11-05 18:05 次阅读

不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法功能在不断升级变化。

虽然我们的教材有这么一个结论:C++语言是面向过程的语言,C++是面向对象的编程语言,但面向对象的概念是在C语言阶段就有了,而且应用到了很多地方,比如某些操作系统内核、通信协议等。

面向对象编程,也就是大家说的OOP(ObjectOrientedProgramming)并不是一种特定的语言或者工具,它只是一种设计方法、设计思想,它表现出来的三个最基本的特性就是封装、继承与多态。

strongerHuang

1

为什么要用C语言实现面向对象

阅读文本之前肯定有读者会问这样的问题:我们有C++面向对象的语言,为什么还要用C语言实现面向对象呢?

C语言这种非面向对象的语言,同样也可以使用面向对象的思路来编写程序的。只是用面向对象的C++语言来实现面向对象编程会更简单一些,但是C语言的高效性是其他面向对象编程语言无法比拟的。

当然使用C语言来实现面向对象的开发相对不容易理解,这就是为什么大多数人学过C语言却看不懂Linux内核源码。

所以这个问题其实很好理解,只要有一定C语言编程经验的读者都应该能明白:面向过程的C语言和面向对象的C++语言相比,代码运行效率、代码量都有很大差异。在性能不是很好、资源不是很多的MCU中使用C语言面向对象编程就显得尤为重要。

strongerHuang

2

具备条件

要想使用C语言实现面向对象,首先需要具备一些基础知识。比如:(C语言中的)结构体、函数、指针,以及函数指针等,(C++中的)基类、派生、多态、继承等。

首先,不仅仅是了解这些基础知识,而是有一定的编程经验,因为上面说了“面向对象是一种设计方法、设计思想”,如果只是停留在字面意思的理解,没有这种设计思想肯定不行。

因此,不建议初学者使用C语言实现面向对象,特别是在真正项目中。建议把基本功练好,再使用。

利用C语言实现面向对象的方法很多,下面就来描述最基本的封装、继承和多态。

strongerHuang

3

封装

封装就是把数据和函数打包到一个类里面,其实大部分C语言编程者都已近接触过了。

C标准库中的fopen(),fclose(),fread(),fwrite()等函数的操作对象就是FILE。数据内容就是FILE,数据的读写操作就是fread()、fwrite(),fopen()类比于构造函数,fclose()就是析构函数。

这个看起来似乎很好理解,那下面我们实现一下基本的封装特性。

#ifndefSHAPE_H#defineSHAPE_H#include//Shape的属性typedefstruct{int16_tx;int16_ty;}Shape;//Shape的操作函数,接口函数voidShape_ctor(Shape*constme,int16_tx,int16_ty);voidShape_moveBy(Shape*constme,int16_tdx,int16_tdy);int16_tShape_getX(Shapeconst*constme);int16_tShape_getY(Shapeconst*constme);#endif/*SHAPE_H*/

这是Shape类的声明,非常简单,很好理解。一般会把声明放到头文件里面“Shape.h”。来看下Shape类相关的定义,当然是在“Shape.c”里面。

#include"shape.h"//构造函数voidShape_ctor(Shape*constme,int16_tx,int16_ty){me->x=x;me->y=y;}voidShape_moveBy(Shape*constme,int16_tdx,int16_tdy){me->x+=dx;me->y+=dy;}//获取属性值函数int16_tShape_getX(Shapeconst*constme){returnme->x;}int16_tShape_getY(Shapeconst*constme){returnme->y;}再看下main.c

#include"shape.h"/*Shapeclassinterface*/#include/*forprintf()*/intmain(){Shapes1,s2;/*multipleinstancesofShape*/Shape_ctor(&s1,0,1);Shape_ctor(&s2,-1,2);printf("Shapes1(x=%d,y=%d)",Shape_getX(&s1),Shape_getY(&s1));printf("Shapes2(x=%d,y=%d)",Shape_getX(&s2),Shape_getY(&s2));Shape_moveBy(&s1,2,-4);Shape_moveBy(&s2,1,-2);printf("Shapes1(x=%d,y=%d)",Shape_getX(&s1),Shape_getY(&s1));printf("Shapes2(x=%d,y=%d)",Shape_getX(&s2),Shape_getY(&s2));return0;}编译之后,看看执行结果:

Shapes1(x=0,y=1)Shapes2(x=-1,y=2)Shapes1(x=2,y=-3)Shapes2(x=0,y=0)

整个例子,非常简单,非常好理解。以后写代码时候,要多去想想标准库的文件IO操作,这样也有意识的去培养面向对象编程的思维。

strongerHuang

4

继承

继承就是基于现有的一个类去定义一个新类,这样有助于重用代码,更好的组织代码。在C语言里面,去实现单继承也非常简单,只要把基类放到继承类的第一个数据成员的位置就行了。

例如,我们现在要创建一个Rectangle类,我们只要继承Shape类已经存在的属性和操作,再添加不同于Shape的属性和操作到Rectangle中。

下面是Rectangle的声明与定义:

#ifndefRECT_H#defineRECT_H#include"shape.h"//基类接口//矩形的属性typedefstruct{Shapesuper;//继承Shape//自己的属性uint16_twidth;uint16_theight;}Rectangle;//构造函数voidRectangle_ctor(Rectangle*constme,int16_tx,int16_ty,uint16_twidth,uint16_theight);#endif/*RECT_H*/

#include"rect.h"//构造函数voidRectangle_ctor(Rectangle*constme,int16_tx,int16_ty,uint16_twidth,uint16_theight){/*firstcallsuperclass’ctor*/Shape_ctor(&me->super,x,y);/*next,youinitializetheattributesaddedbythissubclass...*/me->width=width;me->height=height;}

我们来看一下Rectangle的继承关系和内存布局:

因为有这样的内存布局,所以你可以很安全的传一个指向Rectangle对象的指针到一个期望传入Shape对象的指针的函数中,就是一个函数的参数是“Shape*”,你可以传入“Rectangle*”,并且这是非常安全的。这样的话,基类的所有属性和方法都可以被继承类继承!

#include"rect.h"#includeintmain(){Rectangler1,r2;//实例化对象Rectangle_ctor(&r1,0,2,10,15);Rectangle_ctor(&r2,-1,3,5,8);printf("Rectr1(x=%d,y=%d,width=%d,height=%d)",Shape_getX(&r1.super),Shape_getY(&r1.super),r1.width,r1.height);printf("Rectr2(x=%d,y=%d,width=%d,height=%d)",Shape_getX(&r2.super),Shape_getY(&r2.super),r2.width,r2.height);//注意,这里有两种方式,一是强转类型,二是直接使用成员地址Shape_moveBy((Shape*)&r1,-2,3);Shape_moveBy(&r2.super,2,-1);printf("Rectr1(x=%d,y=%d,width=%d,height=%d)",Shape_getX(&r1.super),Shape_getY(&r1.super),r1.width,r1.height);printf("Rectr2(x=%d,y=%d,width=%d,height=%d)",Shape_getX(&r2.super),Shape_getY(&r2.super),r2.width,r2.height);return0;}

输出结果:

Rectr1(x=0,y=2,width=10,height=15)Rectr2(x=-1,y=3,width=5,height=8)Rectr1(x=-2,y=5,width=10,height=15)Rectr2(x=1,y=2,width=5,height=8)

strongerHuang

5

多态

C++语言实现多态就是使用虚函数。在C语言里面,也可以实现多态。现在,我们又要增加一个圆形,并且在Shape要扩展功能,我们要增加area()和draw()函数。但是Shape相当于抽象类,不知道怎么去计算自己的面积,更不知道怎么去画出来自己。而且,矩形和圆形的面积计算方式和几何图像也是不一样的。下面让我们重新声明一下Shape类:

#ifndefSHAPE_H#defineSHAPE_H#includestructShapeVtbl;//Shape的属性typedefstruct{structShapeVtblconst*vptr;int16_tx;int16_ty;}Shape;//Shape的虚表structShapeVtbl{uint32_t(*area)(Shapeconst*constme);void(*draw)(Shapeconst*constme);};//Shape的操作函数,接口函数voidShape_ctor(Shape*constme,int16_tx,int16_ty);voidShape_moveBy(Shape*constme,int16_tdx,int16_tdy);int16_tShape_getX(Shapeconst*constme);int16_tShape_getY(Shapeconst*constme);staticinlineuint32_tShape_area(Shapeconst*constme){return(*me->vptr->area)(me);}staticinlinevoidShape_draw(Shapeconst*constme){(*me->vptr->draw)(me);}Shapeconst*largestShape(Shapeconst*shapes[],uint32_tnShapes);voiddrawAllShapes(Shapeconst*shapes[],uint32_tnShapes);#endif/*SHAPE_H*/

看下加上虚函数之后的类关系图:

5.1虚表和虚指针虚表(VirtualTable)是这个类所有虚函数的函数指针的集合。虚指针(VirtualPointer)是一个指向虚表的指针。这个虚指针必须存在于每个对象实例中,会被所有子类继承。在《InsideTheC++ObjectModel》的第一章内容中,有这些介绍。5.2在构造函数中设置vptr在每一个对象实例中,vptr必须被初始化指向其vtbl。最好的初始化位置就是在类的构造函数中。事实上,在构造函数中,C++编译器隐式的创建了一个初始化的vptr。在C语言里面,我们必须显示的初始化vptr。下面就展示一下,在Shape的构造函数里面,如何去初始化这个vptr。

#include"shape.h"#include//Shape的虚函数staticuint32_tShape_area_(Shapeconst*constme);staticvoidShape_draw_(Shapeconst*constme);//构造函数voidShape_ctor(Shape*constme,int16_tx,int16_ty){//Shape类的虚表staticstructShapeVtblconstvtbl={&Shape_area_,&Shape_draw_};me->vptr=&vtbl;me->x=x;me->y=y;}voidShape_moveBy(Shape*constme,int16_tdx,int16_tdy){me->x+=dx;me->y+=dy;}int16_tShape_getX(Shapeconst*constme){returnme->x;}int16_tShape_getY(Shapeconst*constme){returnme->y;}//Shape类的虚函数实现staticuint32_tShape_area_(Shapeconst*constme){assert(0);//类似纯虚函数return0U;//避免警告}staticvoidShape_draw_(Shapeconst*constme){assert(0);//纯虚函数不能被调用}Shapeconst*largestShape(Shapeconst*shapes[],uint32_tnShapes){Shapeconst*s=(Shape*)0;uint32_tmax=0U;uint32_ti;for(i=0U;i< nShapes; ++i) { uint32_t area = Shape_area(shapes[i]);// 虚函数调用 if (area >max){max=area;s=shapes[i];}}returns;}voiddrawAllShapes(Shapeconst*shapes[],uint32_tnShapes){uint32_ti;for(i=0U;i< nShapes; ++i) { Shape_draw(shapes[i]); // 虚函数调用 }} 5.3 继承 vtbl 和 重载 vptr上面已经提到过,基类包含 vptr,子类会自动继承。但是,vptr 需要被子类的虚表重新赋值。并且,这也必须发生在子类的构造函数中。下面是 Rectangle 的构造函数。

#include"rect.h"#include//Rectangle虚函数staticuint32_tRectangle_area_(Shapeconst*constme);staticvoidRectangle_draw_(Shapeconst*constme);//构造函数voidRectangle_ctor(Rectangle*constme,int16_tx,int16_ty,uint16_twidth,uint16_theight){staticstructShapeVtblconstvtbl={&Rectangle_area_,&Rectangle_draw_};Shape_ctor(&me->super,x,y);//调用基类的构造函数me->super.vptr=&vtbl;//重载vptrme->width=width;me->height=height;}//Rectangle's虚函数实现staticuint32_tRectangle_area_(Shapeconst*constme){Rectangleconst*constme_=(Rectangleconst*)me;//显示的转换return(uint32_t)me_->width*(uint32_t)me_->height;}staticvoidRectangle_draw_(Shapeconst*constme){Rectangleconst*constme_=(Rectangleconst*)me;//显示的转换printf("Rectangle_draw_(x=%d,y=%d,width=%d,height=%d)",Shape_getX(me),Shape_getY(me),me_->width,me_->height);}

5.4虚函数调用有了前面虚表(VirtualTables)和虚指针(VirtualPointers)的基础实现,虚拟调用(后期绑定)就可以用下面代码实现了。

uint32_tShape_area(Shapeconst*constme){return(*me->vptr->area)(me);}这个函数可以放到.c文件里面,但是会带来一个缺点就是每个虚拟调用都有额外的调用开销。为了避免这个缺点,如果编译器支持内联函数(C99)。我们可以把定义放到头文件里面,类似下面:

staticinlineuint32_tShape_area(Shapeconst*constme){return(*me->vptr->area)(me);}如果是老一点的编译器(C89),我们可以用宏函数来实现,类似下面这样:

#defineShape_area(me_)((*(me_)->vptr->area)((me_)))看一下例子中的调用机制:

5.5main.c

#include"rect.h"#include"circle.h"#includeintmain(){Rectangler1,r2;Circlec1,c2;Shapeconst*shapes[]={&c1.super,&r2.super,&c2.super,&r1.super};Shapeconst*s;//实例化矩形对象Rectangle_ctor(&r1,0,2,10,15);Rectangle_ctor(&r2,-1,3,5,8);//实例化圆形对象Circle_ctor(&c1,1,-2,12);Circle_ctor(&c2,1,-3,6);s=largestShape(shapes,sizeof(shapes)/sizeof(shapes[0]));printf("largetsShapes(x=%d,y=%d)",Shape_getX(s),Shape_getY(s));drawAllShapes(shapes,sizeof(shapes)/sizeof(shapes[0]));return0;}输出结果:

largetsShapes(x=1,y=-2)Circle_draw_(x=1,y=-2,rad=12)Rectangle_draw_(x=-1,y=3,width=5,height=8)Circle_draw_(x=1,y=-3,rad=6)Rectangle_draw_(x=0,y=2,width=10,height=15)

strongerHuang

6

总结

还是那句话,面向对象编程是一种方法,并不局限于某一种编程语言。用C语言实现封装、单继承,理解和实现起来比较简单,多态反而会稍微复杂一点,如果打算广泛的使用多态,还是推荐转到C++语言上,毕竟这层复杂性被这个语言给封装了,你只需要简单的使用就行了。但并不代表,C语言实现不了多态这个特性。

参考素材:

https://blog.csdn.net/onlyshi/article/details/81672279

责任编辑:xj

原文标题:C语言实现面向对象的原理

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

原文标题:C语言实现面向对象的原理

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

【干货】单片机入门到精通之单片机C语言知识分享

学习单片机C语言必要知识点集合,很实用,需要的可以看看,可以有很大提升。 ...
发表于 02-27 11:31 130次 阅读
【干货】单片机入门到精通之单片机C语言知识分享

荣小菜补钙记第12期:基于LabVIEW OOP的仪表控制库(9)

荣小菜补钙记第12期:基于labview OOP的仪表控制库(9)同步更新于 WeChat:荣小菜在补钙大家好,我是荣小菜,也可以叫我Ric...
发表于 02-26 22:52 59次 阅读
荣小菜补钙记第12期:基于LabVIEW OOP的仪表控制库(9)

C语言程序设计实用教程

在各章的讲解穿插典型实例进行说明。本书的写作以基本功能介绍(穿插实例)为主,每章最后以一个比较典型的....
发表于 02-26 16:17 11次 阅读
C语言程序设计实用教程

DSP芯片的应用总结详细资料说明

数字信号处理( Digital Signal Processing ,简称DSP )是一门涉及许多学....
发表于 02-25 11:52 36次 阅读
DSP芯片的应用总结详细资料说明

干货分享:C语言函数大全和C语言程序实例~

对于初学C语言以至于单片机的,很好的例程练习和C语言函数查阅资料,对于程序员笔试题也是很好的借鉴。 ...
发表于 02-25 11:30 132次 阅读
干货分享:C语言函数大全和C语言程序实例~

怎么制作寻迹小车?

智能小车现在差不多是竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下寻迹小车...
发表于 02-25 07:26 0次 阅读
怎么制作寻迹小车?

C语言编程的基本规范有哪些?

为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。本标准规定了程序设计人员进行程序设计时必须遵循...
发表于 02-24 07:22 0次 阅读
C语言编程的基本规范有哪些?

C与VB语言联合在proteus上仿真实例的工程文件免费下载

本文档的主要内容详细介绍的是C与VB语言联合在proteus上仿真实例的工程文件免费下载。
发表于 02-23 08:00 14次 阅读
C与VB语言联合在proteus上仿真实例的工程文件免费下载

单片机应用编程技巧那些常见的问题有哪些?

C语言和汇编语言在开发单片机时各有哪些优缺点?   C或汇编语言可以用于单片机,C++能吗?   搞单片机...
发表于 02-23 06:10 0次 阅读
单片机应用编程技巧那些常见的问题有哪些?

荣小菜补钙记第11期:基于LabVIEW OOP的仪表控制库(8)

荣小菜补钙记第11期:基于labview OOP的仪表控制库(8) 同步更新于 WeChat:荣小菜在补钙大家好,我是荣小菜,也可以叫我R...
发表于 02-22 21:10 0次 阅读
荣小菜补钙记第11期:基于LabVIEW OOP的仪表控制库(8)

基于LabVIEW OOP的仪表控制库(7)

荣小菜补钙记第10期:基于labview OOP的仪表控制库(7)同步更新于 WeChat:荣小菜在补钙 大家好,我是荣小菜,也可以叫我R...
发表于 02-20 23:22 0次 阅读
基于LabVIEW OOP的仪表控制库(7)

嵌入式C语言的高级用法

内存管理 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都....
的头像 玩转单片机 发表于 02-20 14:25 135次 阅读
嵌入式C语言的高级用法

单片机为什么要使用C语言看了就知道

单片机为什么要使用C语言?
发表于 02-19 06:18 0次 阅读
单片机为什么要使用C语言看了就知道

荣小菜补钙记第9期:基于LabVIEW OOP的仪表控制库(6)

荣小菜补钙记第9期:基于LabVIEW OOP的仪表控制库(6) 同步更新于 WeChat:荣小菜在补钙大家好,我是荣小菜,也可以叫我...
发表于 02-18 21:08 377次 阅读
荣小菜补钙记第9期:基于LabVIEW OOP的仪表控制库(6)

WINCC界面动画惹的祸

时间到了2007年,旧项目这些画面动画逼真的电脑快淘汰了,这些项目文件对工控机设置参数从CMOS,到....
发表于 02-13 17:50 160次 阅读
WINCC界面动画惹的祸

STM32中重要的C语言知识点整理

说在前面的话 一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,....
的头像 嵌入式ARM 发表于 02-10 17:31 352次 阅读
STM32中重要的C语言知识点整理

c++filt命令:用于解析C++和Java中被修饰的符号

1. 命令简介 c++filt 命令可用于解析 C++ 和 Java 中被修饰的符号,比如变量与函数....
的头像 Linux爱好者 发表于 02-09 18:22 365次 阅读
c++filt命令:用于解析C++和Java中被修饰的符号

使用单片机C语言程序实现电子秤仿真设计的实例免费下载

本文档的主要内容详细介绍的是使用单片机C语言程序实现电子秤仿真设计的实例免费下载。
发表于 02-04 16:25 117次 阅读
使用单片机C语言程序实现电子秤仿真设计的实例免费下载

C语言开发单片机为啥都是全局变量形式?

全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是: 1. 做控制的工程师; 2. 做非嵌入式....
发表于 02-04 06:14 37次 阅读
C语言开发单片机为啥都是全局变量形式?

C语言多线程的详细教程资料说明

Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务....
发表于 02-03 17:02 49次 阅读
C语言多线程的详细教程资料说明

51单片机C语言常用模块与综合系统设计实例精讲的PDF电子书免费下载

《51单片机C语言常用模块与综合系统设计实例精讲》全书针对目前最通用流行的51单片机系列,通过大量典....
发表于 02-03 10:40 74次 阅读
51单片机C语言常用模块与综合系统设计实例精讲的PDF电子书免费下载

如何在C代码中插入寄存器?

对于逻辑级数较高的路径,常用的方法之一是在其中插入流水寄存器,将路径打断,从而降低逻辑延迟,这在HD....
的头像 Lauren的FPGA 发表于 02-02 17:07 314次 阅读
如何在C代码中插入寄存器?

C++中vector的定义与初始化

C++中的vector vector(向量)是一种序列式容器,类似于数组,但比数组更优越。一般来说数....
的头像 Lauren的FPGA 发表于 02-02 16:41 215次 阅读
C++中vector的定义与初始化

Verilog数字系统设计教程的PDF电子书免费下载

数字信号处理(DSP)系统的研究人员一直在努力寻找各种优化的算法来解决相关的信号处理问题。当他们产生....
发表于 02-02 16:19 48次 阅读
Verilog数字系统设计教程的PDF电子书免费下载

使用单片机C语言实现步进电机正反转的实例免费下载

本文档的主要内容详细介绍的是使用单片机C语言实现步进电机正反转的实例免费下载。
发表于 02-02 11:19 71次 阅读
使用单片机C语言实现步进电机正反转的实例免费下载

使用单片机C语言实现消防车警报的实例程序和工程文件免费下载

本文档的主要内容详细介绍的是使用单片机C语言实现消防车警报的实例程序和工程文件免费下载。
发表于 02-02 10:48 43次 阅读
使用单片机C语言实现消防车警报的实例程序和工程文件免费下载

使用单片机C语言实现步进电机转动原理的实例程序和工程文件免费下载

本文档的主要内容详细介绍的是使用单片机C语言实现步进电机转动原理的实例程序和工程文件免费下载。
发表于 02-02 10:48 63次 阅读
使用单片机C语言实现步进电机转动原理的实例程序和工程文件免费下载

使用单片机C语言实现音乐播放的实例程序和工程文件免费下载

本文档的主要内容详细介绍的是使用单片机C语言实现音乐播放的实例程序和工程文件免费下载。
发表于 02-02 10:48 40次 阅读
使用单片机C语言实现音乐播放的实例程序和工程文件免费下载

从最底层的内存存储空间开始带你了解C语言指针

一、前言 二、变量与指针的本质 三、指针的几个相关概念 四、指向不同数据类型的指针 五、总结 一、前....
的头像 嵌入式ARM 发表于 02-02 10:40 190次 阅读
从最底层的内存存储空间开始带你了解C语言指针

单片机C语言程序设计实例之使用74HC595控制数码管显示四位数字

本文档的主要内容详细介绍的是单片机C语言程序设计实例之使用串入并出芯片74HC595控制数码管显示四....
发表于 02-01 16:45 77次 阅读
单片机C语言程序设计实例之使用74HC595控制数码管显示四位数字

单片机C语言程序设计实例之双向来回的流水灯

本文档的主要内容详细介绍的是单片机C语言程序设计实例之双向来回的流水灯免费下载。
发表于 02-01 16:45 61次 阅读
单片机C语言程序设计实例之双向来回的流水灯

单片机C语言程序设计实例之带日历时钟及温度显示的电子万年历

本文档的主要内容详细介绍的是单片机C语言程序设计实例之带日历时钟及温度显示的电子万年历程序和工程文件....
发表于 02-01 16:45 52次 阅读
单片机C语言程序设计实例之带日历时钟及温度显示的电子万年历

单片机C语言程序设计实例之闪烁的LED

本文档的主要内容详细介绍的是单片机C语言程序设计实例之闪烁的LED程序和工程文件免费下载。
发表于 02-01 16:45 58次 阅读
单片机C语言程序设计实例之闪烁的LED

如何完全使用python实现工作

 第一天, 太初有道, 神谕, import light, 于是便有光。( Quick fact: ....
发表于 02-01 10:33 49次 阅读
如何完全使用python实现工作

C51单片机C语言程序设计解析的学习课件免费下载

C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数main....
发表于 02-01 09:58 66次 阅读
C51单片机C语言程序设计解析的学习课件免费下载

什么是PDAL?它与其他工具有何不同?

PDAL是点云数据处理的库。这是一个C/C++开源库,用于点云数据的转换和处理。尽管该库中许多工具的....
的头像 新机器视觉 发表于 01-27 11:27 385次 阅读
什么是PDAL?它与其他工具有何不同?

手把手教你学51单片机的C语言版PDF电子书免费下载

本书旨在培养和锻炼单片机系统实用开发技能,全书以实践为主线,让读者在一个个实践案例中逐步掌握单片机电....
发表于 01-27 08:00 145次 阅读
手把手教你学51单片机的C语言版PDF电子书免费下载

使用单片机实现LED循环右移的C语言实例免费下载

  本文档的主要内容详细介绍的是使用单片机实现LED循环右移的C语言实例免费下载。
发表于 01-26 17:23 60次 阅读
使用单片机实现LED循环右移的C语言实例免费下载

使用单片机实现LED循环左移的C语言实例免费下载

本文档的主要内容详细介绍的是使用单片机实现LED循环左移的C语言实例免费下载。
发表于 01-26 17:16 51次 阅读
使用单片机实现LED循环左移的C语言实例免费下载

C语言要如何面向对象编程?

一、前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的....
的头像 嵌入式ARM 发表于 01-26 09:58 268次 阅读
C语言要如何面向对象编程?

C++串口控件CportC6的程序和工程文件免费下载

本文档的主要内容详细介绍的是C++串口控件CportC6的程序和工程文件免费下载。
发表于 01-23 08:00 65次 阅读
C++串口控件CportC6的程序和工程文件免费下载

单独的C++ Builder 6的升级包应用程序免费下载

单独的C++ Builder 6的升级包应用程序免费下载
发表于 01-23 08:00 46次 阅读
单独的C++ Builder 6的升级包应用程序免费下载

VHDL硬件描述语言的学习课件免费下载

本文档的主要内容详细介绍的是VHDL硬件描述语言的学习课件免费下载包括了:VHDL概述,VHDL数据....
发表于 01-22 08:00 42次 阅读
VHDL硬件描述语言的学习课件免费下载

HC6800-ES V1.0单片机开发板的实验指导书免费下载

本开发板相对以往开发板的特点是综合性比较高、把短路冒去掉了 省去接线的麻烦更加方便了初学者、是一款性....
发表于 01-21 08:00 49次 阅读
HC6800-ES V1.0单片机开发板的实验指导书免费下载

C++ function技术的实现与具体运用

当std::function对象没有初始化任何实际的可调用元素,调用std::function对象将....
的头像 Linux爱好者 发表于 01-20 09:23 253次 阅读
C++ function技术的实现与具体运用

51单片机的硬件与工作原理的详细资料说明

本文档的主要内容详细介绍的是51单片机的硬件与工作原理的详细资料说明包括了:1、51单片机的硬件与工....
发表于 01-19 17:21 96次 阅读
51单片机的硬件与工作原理的详细资料说明

讲解C++ function 技术的实现与具体运用

当std::function对象没有初始化任何实际的可调用元素,调用std::function对象将....
的头像 Linux爱好者 发表于 01-19 17:05 279次 阅读
讲解C++ function 技术的实现与具体运用

Python源码剖析的PDF电子书免费下载

为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使....
发表于 01-19 08:00 50次 阅读
Python源码剖析的PDF电子书免费下载

FPGA的零基础入门教程

本文档的主要内容详细介绍的是FPGA的零基础入门教程免费下载。
发表于 01-18 16:47 89次 阅读
FPGA的零基础入门教程

全局变量简直就是嵌入式系统的戈兰高地

要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频C....
的头像 MCU开发加油站 发表于 01-18 16:26 642次 阅读
全局变量简直就是嵌入式系统的戈兰高地

从一个简单的C++小程序入手 站在汇编角度C++程序的条件判断语句

在当下,如果还能熟练地用汇编写程序的人怕是会被当成怪人来对待(我之前公司就有一个用汇编程序的 ),即....
的头像 strongerHuang 发表于 01-18 11:24 285次 阅读
从一个简单的C++小程序入手 站在汇编角度C++程序的条件判断语句

C语言与C++相互调用

    1C与C++相互调用 在一个嵌入式系统中大部分的底层和驱动层更多的是采用C语言来进行开发,而....
的头像 strongerHuang 发表于 01-18 11:05 305次 阅读
C语言与C++相互调用

MS8006C参数特性介绍 32位MCU ARM® Cortex®-M0+ 内核

MS8006 是一款内嵌 32 位 ARM® Cortex®-M0+ 内核的超低功耗、Low Pin....
发表于 01-18 09:17 165次 阅读
MS8006C参数特性介绍 32位MCU  ARM® Cortex®-M0+ 内核

MS8005参数特性介绍 通用8051 Core MCU 256 字节 RAM内核

MS8005 是通用型 1T 8051 Core MCU。在同样的系统时钟下,比传统的 8051 运....
发表于 01-18 09:12 256次 阅读
MS8005参数特性介绍 通用8051 Core MCU 256 字节 RAM内核

学习ARM的学习历程和资料说明

说实话,入门真的很痛苦,那种徘徊再门外而不得要领的感觉真的很痛苦, 论坛上大多数教程啊例子什么的都是....
发表于 01-15 17:56 95次 阅读
学习ARM的学习历程和资料说明

51单片机的C语言程序设计学习课件免费下载

本文档的主要内容详细介绍的是51单片机的C语言程序设计学习课件免费下载包括了:C51语言概述,C51....
发表于 01-15 17:56 96次 阅读
51单片机的C语言程序设计学习课件免费下载

DSP芯片的原理及开发应用讲解的PDF电子书免费下载

信号处理( Digital Signal Processing,简称DSP)是一门涉及多学犭领域的新....
发表于 01-15 17:40 106次 阅读
DSP芯片的原理及开发应用讲解的PDF电子书免费下载

基于浮点C语言编程的计算密集DSP算法实现语音识别芯片结构的设计

新加坡Columns公司在便携式语音控制产品应用中起步较早,其中一个产品是执行欧元与其他欧洲货币之间....
的头像 电子设计 发表于 01-14 09:41 743次 阅读
基于浮点C语言编程的计算密集DSP算法实现语音识别芯片结构的设计

TouchGFX是一个基于STM32硬件由C++写成的软件框架

在TouchGFX 文件夹中找到ApplicationTemplate.touchgfx.part,....
的头像 RTThread物联网操作系统 发表于 01-13 16:43 524次 阅读
TouchGFX是一个基于STM32硬件由C++写成的软件框架