问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何将C++程序转换为C程序的探讨

发布网友 发布时间:2023-02-11 16:25

我来回答

1个回答

热心网友 时间:2024-10-23 11:50

关于如何将C++程序转换为C程序的探讨

  [摘要]C++是在C的基础上演变而来的,在我们的实际应用中用C++编的源程序就一定比用C编的源程序可行吗?不尽然,因为C++解释器比C语言解释器占用的存储空间要大。在嵌入式系统中为了节省有限的存储空间,降低成本,将用C++语言写的源程序转换成C语言源程序是很有必要的。

  [关键词]C++ 程序 C程序 转换探讨

  一、C++与C程序概述

  C++是在C的基础上演变而来的,C++与C区别最大的就是C++中的类的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。方法有两种:第一种是将C++中的面向对象特征去掉,先全部理解源代码的逻辑,然后改写;第二种是在C中保留面向对象的部分特征,用结构体实现类的功能。第一种方法,对于类的数目很少的情况还可以,如果类的数目比较多,全部理解源代码,然后重写就很耗时间,而且很容易出错,更甚者,如果遇到大的项目想全部理解源代码几乎是不可能的。这个时候就需要采用第二种方法了,你可以一个类一个类的改没有什么太高的难度,如果没有笔误的话,几乎不会出错,而且根本不需要理解程序逻辑,也许改完后你对程序所要实现的功能还一无所知。这倒不是说一无所知对大家有好处,只是说这种方法的与程序逻辑本身的无关性。所以,在此用第二种方法对C++的一些特性,以及如何在C里实现或者替代,作一些初步的探讨。

  二、C++程序到C程序的转换

  为了便于下面的讨论先做几点说明:

  1.函数Ixx为类xx的构造函数的实现。

  2.原类的成员函数改为前缀为 结构体名+‘_’的函数。

  3.函数指针U为原类的析构函数的声明;

  4.U+结构体名称 为原类的析构函数的实现;

  5.Fun_+结构体名 为对该结构体成员函数指针进行指向。

  以后遇到上述情况将不再说明。

  (一)类的成员函数和数据成员

  由于struct没有对成员的访问权限进行控制,必须加入额外的机制进行访问控制,这样一来就使得程序复杂化了,所以只能放弃访问权限的控制。

  1.对于类的数据成员可以直接转为C中结构体的数据成员。

  2.函数则需转化为对应的函数指针,因为struct里不允许出现函数的声明和定义。而函数前如果有virture,inline等修饰符也要去掉,如函数void funca(int a);改为void (*funca)(struct B *p,int a);大家可以看到函数指针的原型里加了一个指针struct B的指针,这是因为要在函数内部对类的成员进行操作,要靠该指针指定结构体的成员。在类的成员函数里,实际上在参数列里也隐含有一个指向自身的this指针。

  3.对于静态成员则要定义成全局变量或全局函数,因为结构体中不能有静态成员。

  (二)类的构造函数

  类在实例化的时候会调用类的缺省构造函数,在struct里,要定义一个同名函数指针指向一个具有构造函数功能的初始化函数,与构造函数不同的是,要在初始化函数里加入进行函数指针初始化的语句。使用的时候在创建结构体变量的时候要用malloc而不是new,并且这个时候要手工调用初始化函数。

  (三)类的析构函数

  类的析构函数所作的工作是释放所占的资源。

  在C中,无论是哪个struct都用函数指针U替代析构函数。之所以所有的struct都用指针U是基于如下情况:

  如果将子类指针赋给基类指针,基类指针在释放的时候不必考虑调用哪个函数名的析构函数,只需调用成员函数U即可。成员函数U需要像一般成员函数一样在fun_类名()函数中指定。?

  类的.析构函数是由系统调用的,在C中则要显式调用。至于何时调用,要准确判断。

  (四)类的拷贝构造函数

  类的拷贝构造函数主要用途是加快以下情况下类的构建速度:

  1.作为参数传给函数。(additem(Itema))

  2.作为函数返回值。

  3.实例化类时作参数。

  这三种情况下都是由系统直接调用类的拷贝构造函数而不是构造函数。

  注意:C=D;不会调用拷贝构造函数,这种情况下使用的是重载‘=’运算符的方法。(详见运算符重载);

  由于C中定义struct变量的时候,使用的全部是指针,不会用到拷贝构造函数,所以暂不考虑。对于原来函数参数或者返回值需要类变量的,要全部转化为类指针的方式。实例化类时作参数的情况,可以通过另外定义一个带参数的构造函数来解决。

  (五)类的内联函数和虚函数

  内联函数和虚函数的修饰符inline 、virture 要全部去掉。内联函数体则要去掉,将内联函数在外面定义成一个函数。如:

  class B

  {

  …

  virture void funb();

  inline int add()const

  {return a+b;};

  private:

  int a;

  int b;

  …

  }

  改为:

  typedef classB B;

  struct classB

  {

  …

  void (*funb)(struct classB *p);

  int (*add)(struct classB *p);

  int a;

  int b;

  }

  void classB_funb(B *p)

  {

  …

  }

  int classB_add(B *p)

  {

  return p->a+p->b;

  }

  void fun_classB(B *p)

  {

  …

  p->funb=classB_funb;

  p->add= classB_add;

  }

  (六)重载

  类中重载有函数重载和运算符重载两种:

  1.函数的重载

  函数重载满足的条件是:函数名相同,参数个数或者参数类型不同。这样在调用的时候,会根据你输入的参数不同,调用不同的函数。在C中只好分别起不同的名字,没有别的解决办法。

如何将C++程序转换为C程序的探讨

1.对于类的数据成员可以直接转为C中结构体的数据成员。2.函数则需转化为对应的函数指针,因为struct里不允许出现函数的声明和定义。而函数前如果有virture,inline等修饰符也要去掉,如函数void funca(int a);改为void (*funca)(struct B *p,int a);大家可以看到函数指针的原型里加了一个指针struc...

C程序设计(第四版)课后习题答案

在第1章中,阐述了程序设计的概念和C语言的特点,为后续学习打下坚实基础。第2、3章深入探讨了算法,作为程序的灵魂,以及编写最简单的C程序设计——顺序程序设计,为算法在C语言中的应用提供清晰指导。第4、5章聚焦于选择结构与循环结构程序设计,通过实际操作,掌握复杂逻辑判断与循环控制。第6、7章...

计算机自制操作系统(十三):汇编语言与C语言的混合编程

在C程序中,我们使用EXTERN和GLOBAL关键字来标识需要调用的汇编函数。通过修改链接器haribote.rul,我们将入口函数HariMain更改为标准的Main。当C调用汇编函数时,call指令的参数在链接后会进行调整,但这并不影响它们之间的协同工作。链接器会将汇编代码插入到C程序的尾部,确保准确的函数调用。链接器的运作...

一起学习C与C++ 可以吗?

第一个C语言程序,就是那个经典的HelloWorld,我调了几个星期,上机机会非常少,也没有书告诉我开发环境(TC2.0)需要设置,而且开始我都不知道有编译器,我甚至自作聪明把写好的程序扩展名从.c改成.exe,结果可想而知。大一学完了C、X86的汇编、数据结构、C++。由于精力都花在自学上了,大一下四门课挂了彩,三类学校...

扒一扒ELF文件

在探讨ELF文件之前,我们先了解一个.c程序转变为可执行目标文件的过程。以main.c和sum.c为例,sum.c接收数组和数组长度参数,将数组求和结果返回;main.c调用sum函数,并传递一个两元素的int数组array,将计算结果保存在val中。使用GCC编译两个模块时,main.c和sum.c将分别生成可重定位的目标文件main...

C语言I/O输入输出专题——开篇

17. 各个主流C语言开发环境的重定向设置。18. 文本文件和二进制文件的区别。19. 设计一个C程序统计文本文件的单词个数。20. putchar函数和scanf函数的混用问题。21. getchar函数和scanf函数的区别。22. 如何验证输入的是整数或字符?23. 在Windows和Linux系统上,按下“回车”键后输出的字符。共计23...

C语言中的类型转换

首先,了解一种简单方法用于判断数据类型。定义一个整型指针变量p,尝试赋值给不同类型的变量。若编译器报错,表明无法相互赋值,从而判断出变量类型。接着,探索同类型数据之间的运算规则。整型运算通常将结果转换为与原类型相同或更高级别的类型。例如,char与char运算结果为int,而char与long运算结果为long...

嵌入式软件基础:C语言与汇编的融合内容简介

在高等教育领域,对于计算机组成原理和汇编语言程序设计课程的传统教材,嵌入式软件基础:C语言与汇编的融合(翻译版)提供了一个创新的教学选择。该书的独特之处在于,它以实践为导向,讲解如何使用汇编语言编写实现特定功能的例程,这些例程通常由主程序,如C语言,调用,以此来展示其在实际应用中的价值。通...

带你一步步调试CPython源码(二、词法分析)

在Python/pythonrun.c中,我们会在243行设置断点,跟踪CPython调用_PyParser_ASTFromFile将字符串转换为抽象语法树的过程。接着,程序会进入_PyPegen_run_parser_from_file_pointer,进行词法和语法分析。这个阶段从_PyTokenizer_FromFile开始,创建tok_state,初始化语法分析器,然后调用_PyPegen_run_...

解析C程序设计内容简介

第一章至第三章是C语言的基础入门,涵盖了程序的基本结构、上机操作、简单程序设计以及函数设计等内容,为初学者打下扎实的基础。第四章和第五章转向程序设计的核心,侧重于控制结构和模块化设计,使读者能更好地构建复杂的逻辑流程。第六、七章则进入提升阶段,深入探讨数组、指针、结构体等高级概念以及...

天正Cαd如何转换成Cad 如何运行一个C程序 C程序是由什么构成的 C程序的构成 C程序的执行是从 一个C程序的执行是随着 C程序的机构 最简单的C程序 C程序的从哪里开始执行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
哈图布呼镇地理区位 塔布勒合特蒙古民族乡沿革 有欠账人的支付宝能找到身份记录吗 联想a770e解除合约使用其他电信卡 特克斯阿克塔斯风景区的门票怎样预定性价比高? 东兴镇地理位置 20M联通宽带,使用300M 11N无线路由器,用有线连接下载速度能到3.XM/S... ...身份证照片,1那样不就泄露个人信息了吗?2支付宝能确保他的员_百度知... 剑与远征1.67版本更新公告介绍_剑与远征1.67版本更新公告是什么 (联想a278t)手机获取root权限失败后,手机出现了很多毛病。别人拨打我时... 身份证补办需要多长时间呢? 清肝明目 只需一味车前草 植物花语之车前草花语? 孙叔敖之母文言文翻译及注释 女孩子艺名? 女生取什么艺名好听 好听的艺名女 如果在演讲的过程中怯场或中途忘词应该怎么办 如何克服当众讲话时的怯场心理呢? 怎么解决在演讲中怯场问题解决在演讲中怯场问题的方法 如何用英文形容「美食、美味」?四种英文说法让你学会如何称赞美食!_百度... 华为手机荣耀7和华为p8的区别是什么 华为P8和荣耀7哪个更好一点 雨天温馨感人的晚安问候语? 下雨晚安的句子 晚安的句子示例 ...及自学教程。地址:1072169383@qq.com 先谢谢了 谢霆锋歌词 鱼为什么总浮上水面? 频繁看qq主页会有记录吗 办不动产权证没有房产证可以办吗 一个肩膀背着书包叫什么 加工资3%是多少 那里有HDRI文件??? max高动态贴图那里有下载? 蚁人还有第二部么 蚁人第二部什么时候上映 早上早点中午晚上火锅的店面门头取什么名字 应急发电车租赁费用 梦见自己掉牙齿有什么预兆?是什么意思? 小米不解锁打字 小米为什么不用天玑 小米不自动填充密码,要更新系统吗 小米不升级系统会影响信号吗 人比较黑穿什么颜色衣服好看 冬至的解释含义 周围的研究领域 您好,请问有电路分析基础答案吗?能给我发一份吗?tianhang.zhu@163... 怎样正确处理触电问题? 实名认证过的怎么找回 实名认证过的和密码忘了,怎么找回? 实名认证过的和密码忘了,怎么找回?