1. 首页
  2. 电子数码
  3. windows ce 6.0嵌入式高级编程(嵌入式 C 语言的高级用法)

windows ce 6.0嵌入式高级编程(嵌入式 C 语言的高级用法)

简介:关于windows ce 6.0嵌入式高级编程(嵌入式 C 语言的高级用法)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于电子数码技术大全及相关资讯,可以多多关注茶馆百科网。

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

虽然我们的课本上有这样的结论:C语言是面向过程的语言,c++是面向对象的编程语言,但是面向对象的概念在C语言阶段,并应用到很多地方,比如一些操作系统内核,通信协议等等。

面向对象编程,即OOP (Object Oriented Programming)不是一种特定的语言或工具,它只是一种设计方法、设计思想,它表现出封装、继承和多态三个最基本的特征。

在阅读本文之前,一些读者肯定会问以下问题:当我们有c++面向对象的语言时,为什么还要用C来实现面向对象?

C语言这种非面向对象的语言,也可以采用面向对象的思想来编写程序。

在面向对象的c++语言中实现面向对象的编程更简单,但是C语言的效率是其他面向对象编程语言无法比拟的。

当然,使用C进行面向对象的开发相对来说比较难以理解,这就是为什么大多数学过C的人无法阅读Linux内核源代码的原因。

因此,这个问题是相当容易理解的,只要读者有一定的C语言编程经验就应该能够理解:过程式C语言和面向对象c++语言相比,代码运行效率、代码量有很大的不同。在性能不是很好的情况下,资源也不是很多的单片机中使用C语言进行面向对象编程显得尤为重要。

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

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

因此,不建议初学者使用C来实现面向对象,尤其是在实际项目中。建议在使用这些基本技能之前先好好练习。

用C语言实现面向对象的方法有很多。下面介绍最基本的封装、继承和多态性。

封装是将数据和函数打包到一个类中,事实上,大多数C程序员都接触过。

C库的fopen(), fclose(), fread(), fwrite()函数对FILE进行操作。数据内容是FILE,读取和写入数据是fread(), fwrite(), fopen()类似于构造函数,fclose()是析构函数。

这似乎是有道理的,所以让我们实现基本的封装特性。

#ifndef shape_h#定义shape_h#包括stint .h//形状类型定义struct Shape;void Shape_ctor(Shape * const me, int16_tx, int16_ty);void Shape_moveBy(Shape * const me, int16_t dx, int16_t dy);int16_t Shape_getX(Shape const * const me);int16_t Shape_getY(Shape const * const me);#endif 这是Shape类的声明。这很简单,很容易理解。您可以将声明放在名为Shape.h的头文件中。看一下Shape类的定义。C当然。

void Shape_ctor(Shape * const me, int16_t x, int16_t y)void Shape_moveBy(Shape * const me, int16_t dx, int16_t dy) //获取属性值函数int16_t Shape_getX(Shape const * const me) int16_t Shape_getY(Shape const * const me)再次查看main.c

#include ' Shape .h' #include stdio.h int main()编译后查看结果:

形状s1(x=0,y=1)形状s2(x=-1,y=2)形状s1(x=2,y=-3)形状s2(x=0,y=0)整个例子,很简单,很容易理解。今后在编写代码时,应该多考虑标准库的文件IO操作,从而有意识地培养面向对象编程的思维。

例如,如果我们想创建一个Rectangle类,我们只需要将Shape类中已经存在的属性和动作添加到与该Shape不同的属性和动作中。

下面是Rectangle的声明和定义:

#ifndef rect_h#定义rect_h#包括'shape.h' //基接口//typedef struct矩形属性;//构造函数void Rectangle_ctor(Rectangle * const me, int16_t x, int16_t y, uint16_t width, uint16_t height);void Rectangle_ctor(Rectangle * const me, int16_t x, int16_t y, Rectangle * const me, int16_t x, int16_t y, He uint16_t width, uint16_t height)让我们来看看Rectangle的继承和内存布局:

由于这种布局,将指向Rectangle对象的指针传递给需要指向Rectangle对象的指针的函数是安全的。对于参数为“Shape *”的函数,您可以传入“Rectangle *”,这是安全的。这样,基类的所有属性和方法都可以被继承的类继承!

#include 'rect.h' #include stdio.h int main()

Rect r1(x=0,y=2,宽=10,高=15)Rect r2(x=-1,y=3,宽=5,高=8)Rect r1(x=-2,y=5,宽=10,高=15)Rect r2(x=1,y=2,宽=5,高=8)

1、为什么用C实现OOP

c++语言通过虚函数实现多态。在C语言中,也可以实现多态性。

现在,我们将添加另一个圆,并扩展Shape,我们将添加area()和draw()函数。但是Shape就像一个抽象类。它不知道如何计算自己的面积,更不用说如何画自己了。而且,矩形和圆形的面积计算与几何图像不同。

让我们重新声明Shape类:

#ifndef shape_h#定义shape_h#包括stdint。hstruct ShapeVtbl;//有一个类型定义结构体Shape;struct ShapeVtbl;//struct shapevtbl;void Shape_ctor(Shape * const me, int16_tx, int16_ty);void Shape_moveBy(Shape * const me, int16_t dx, int16_t dy);int16_t Shape_getX(Shape const * const me);int16_t Shape_getY(Shape const * const me);静态inline void Shape_draw(Shape const * const me)Shape const *largestShape(Shape const *shapes[], uint32_t nShapes);void drawAllShapes(Shape const *shapes[], uint32_t nShapes);#endif 看看虚函数的类图:

5.1虚表和虚指针

虚表是指向该类所有虚函数的函数指针的集合。

虚指针是指向虚表的指针。这个虚指针必须存在于每个对象实例中,并由所有子类继承。

在《Inside The C++ Object Model》的第一章中,有这些介绍。

在每个对象实例中,必须初始化vptr以指向它的vtbl。初始化的最佳位置是在类构造函数中。实际上,在构造函数中,c++编译器隐式地创建了一个初始化的vptr。在C语言中,我们必须显示初始化vptr。

下面是如何在Shape构造函数中初始化vptr。

#include ' Shape .h'#include assert.h//Shape static uint32_t Shape_area_(Shape const * const me);静态void Shape_draw_(Shape const * const me);//构造函数void Shape_ctor(Shape * const me, int16_t x, int16_t y);Me-vptr=vtbl;Me-x=x;Me-y=y;}void Shape_moveBy(Shape * const me, int16_t dx, int16_t dy)int16_t Shape_getX(Shape const * const me) int16_t Shape_getY(Shape const * const me) //Shape类的虚函数是静态的uint32_t Shape_area_(Shape const * const me)静态void Shape_draw_(Shape const * const me) Shape const *largestShape(Shape const *shapes[], uint32_t nShapes)} return s;5.3继承了vtbl和重载的vptr

如上所述,基类包含vptr,子类会自动继承它。但是,vptr需要由子类的虚表重新分配。而且,这也必须发生在子类的构造函数中。下面是矩形的构造函数。

h //矩形虚拟函数static uint32_t Rectangle_area_(Shape const * const me);#include 'rect.h' #include stdio.h //矩形虚拟函数static uint32_t rectangle_area_(形状const * const me);静态void Rectangle_draw_(形状const * const me);//构造函数void Rectangle_ctor(Rectangle * const me, int16_t x, int16_t y, uint16_t width, uint16_t height);Shape_ctor(me-super, x, y);//调用基类me-super的构造函数。VPTR=vtbl;//重载vptr me-width=width;Me-height=height;}//Rectangle的虚函数实现静态uint32_t Rectangle_area_(Shape const * const me)静态void Rectangle_draw_(Shape const * const me) 5.4虚函数调用

在前面的虚表和虚指针的基本实现中,可以通过下面的代码使用虚调用(后面的指针)。

他uint32_t Shape_area(形状const * const me)这个函数可以在a.c文件中uint32_t Shape_area(形状const * const me),但它带来的一个缺点是与每个虚拟调用相关的额外调用开销。为了避免这个缺点,如果编译器支持内联函数(C99)。我们可以像这样把定义放在头文件中:

如果这是一个较旧的编译器(C89),我们可以用这样的宏函数实现它:

0

5.5 main.c

#include 'rect.h' #include 'circle.h' #include stdio.h int main();形状const *s;//实例化矩形对象Rectangle_ctor(r1, 0,2,10,15);Rectangle_ctor(r2, - 1,3,5,8);//实例化circle对象Circle_ctor(c1, 1, -2, 12);Circle_ctor(c2, 1, -3, 6);s=largestShape(shapes, sizeof(shapes)/sizeof(shapes[0]));printf (largetsShape年代(x=% d, y=% d) \ n”,Shape_getX (s), Shape_getY (s));drawAllShapes(形状,sizeof(形状)/sizeof(形状[0]));返回0;}输出:

largetsShape s(x=1,y=-2)Circle_draw_(x=1,y=-2,rad=12)Rectangle_draw_(x=-1,y=3,宽度=5,高度=8)Circle_draw_(x=1,y=-3,rad=6)Rectangle_ draw_(x=0,y=2,宽度=10,高度=15)

2、所具备的条件

再次,面向对象编程是一种不局限于一种编程语言的方法。用C语言实现封装、单继承,理解和实现都比较简单,多态就会稍微复杂一点,如果打算广泛使用多态,还是推荐用c++语言,毕竟这层复杂性是由语言封装的,你只需要简单的使用就行了。但这并不意味着C不能实现多态性。

本文主要介绍了关于windows ce 6.0嵌入式高级编程(嵌入式 C 语言的高级用法)的相关养殖或种植技术,电子数码栏目还介绍了该行业生产经营方式及经营管理,关注电子数码发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解电子数码技术怎么管理的要点,是您电子数码致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/1465344.html