不过需要声明的是,此次仅仅是测试psp-g++能否顺利编译一个现有的有一定规模的程序,并不是对该程序本身的改进或重写,因此代码部分没有大的变化,部分的变动也仅仅是为了适应c++的语法需要,所以仅作为研究使用。同时,因为改写时比较急促,可能会遗留一些问题(下面会提到),不推荐作为日常应用。Gl[jr?%dDUm{Yn}qAd37*,Q{sKo2vsF1,1UO6QZ>O?U8$vO_Tr7D8OWJlpx?wT+'Bz:6*=/B,l1X本文来自:V电G玩S天K空Y
cnreader向c++的过度历程:fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
1. 将除hz16.c和uni2cjk.c之外的所有.c改为.cppfF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
2. 修改main.h fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
加上#include <stdio.h>fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
#include <stdlib.h>fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
去掉对bool,true,false的声明,c++里已经是关键字了fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
3. 强制类型转换fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
c++里不允许有符号的和无符号的变量隐式转换,所以对每个报错地方都要强制转换。fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
我为了偷懒,更该了一些函数的定义,这里有可能有运行期问题。fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
4. 增加include和头文件里函数声明fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
这也是最烦的部分,也因为c++语法要求一切必须先声明后使用。
下面想做的就是用面向对象的思想对cnreader进行改造,同样也不是为了改进或增加cnreader的功能,而是希望从中提取出一些psp软件开发中的共性和特点。
Gl[jr?%dDUm{Yn}qAd37*,Q{sKo2vsF1,1UO6QZ>O?U8$vO_Tr7D8OWJlpx?wT+'Bz:6*=/B,l1X本文来自:V电G玩S天K空Y昨天运行了一下,没有发现与原来的有什么差别。fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
c++可能比c慢的一个主要原因是如果你使用的类的多态特性,就会造成迟后绑定,使运行效率有所下降。fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
当然如果cpu已经很快了,这点损失可以忽略不计。
callback处理不是c++的特性,c就可以实现fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
插件也一样,一般为了兼容性都是用c的api格式提供fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
类和单个.c文件功能名特殊命名化的转换也比较方便,只要不用多态性fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
其实c++中比较好的功能改进是new/delete内存分配(可惜不支持realloc模式),流,操作符重载,再算上一个后来出现的STL
Gl[jr?%dDUm{Yn}qAd37*,Q{sKo2vsF1,1UO6QZ>O?U8$vO_Tr7D8OWJlpx?wT+'Bz:6*=/B,l1X本文来自:V电G玩S天K空Y
CALLBACK 回调机制fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
属于一种处理机制,而非语言特性。消息驱动机制的程序中,都用得到。fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
简单地说,就是程序通过函数指针来调用不同的函数。复杂点说,CALLBACK是COMMAND模式的基础。fF'-xa}&]auDYTM7_!P1QosLd8bjlCI1(lDXwx'A_{2UF@nkng#*LG?6?%B本文来自:V电G玩S天K空Y
局限性:所有CALLBACK的参数表必须一致;要么为全局的,要么为static的,类成员函数(非static)不能作为CALLBACK。


