将CPP文件移植成C文件方法和注意的问题

来源:互联网 发布:gmp软件 编辑:程序博客网 时间:2024/05/16 06:25

一:将类转换为结构体

第一步:将类当中的所有变量转换为结构体变量(结构体变量公有访问)
// 映射点
class CMappingPoint
{
public:
    __int64        m_nCoordinate;            // 机床坐标(nm)
    __int64        m_nMeasurement;            // 激光干涉仪测量值(nm)
};
转换后
typedef struct MappingPoint
{
    __int64        m_nCoordinate;            // 机床坐标(nm)
    __int64        m_nMeasurement;            // 激光干涉仪测量值(nm)
}CMappingPoint;

第二步:将所有的成员函数转换为全局函数,为每一个函数添加指向此类转换后结构体的指针的形参,方便访问此结构体当中变量。
// 直线轴摩擦补偿
Class CFrictCompensation
{
CFrictCompensation( void ){ memset( this, 0, sizeof *this ); }
    void Reset( void );    
    int Mapping( int nIncrement );    
};

//  初使化构造
Void FrictCompensation_InitFrictCompensation(CFrictCompensation *_This);
// 回零后调用(而后才能进行补偿 。。。)
void FrictCompensation_Reset( CFrictCompensation *_This );
// 输入脉冲增量(nm),输出实际的增量(nm)
int FrictCompensation_Mapping( CFrictCompensation *_This, int nIncrement );

注意:有些成员函数是常函数,也就是只读函数,其主要特点是不会修改成员变量的值,由于在C语言当中不存在常函数概念,移植的时候去掉这个属性。
Class{
void Lookup ( __int64 * pMeasurement, const __int64& nCoordinate ) const;
}
修改后
void Lookup ( __int64 * pMeasurement, const __int64& nCoordinate );

如果存在构造和析构函数,注意需要人为进行调用,注意构造与析构的顺序。C语言不中不会自动初使化。


二:关键字

Operator:
重载操作符,现在只能理解为类的一此比较,比如比较两个类是否相等(==),或者把两个类进行相加(+),主要是对类成员变量的操作。其次比如定义一个类时,返回时运用Operator重载为其它类型或结构体(Pungo/Socke.cpp/Socket_t类)。
C语言当中不存这个关键字,去掉。留意使用它的目的是什么。可能有的地方断言会用到,会报错。

Mutalbe:
C++中用它定义的变量表示可变的易变的,即使在常函数当中也可修改。作用与const相反。
C语言当中不存这个关键字,去掉。

static_cast:
(1)用于基本数据类型之间的转换    如把int转换成char,把int转换成enum
(2)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换 。    static_cast< int > 此关键字只能在有相互联系的类型中相互转换(class CDeviceState : public CDeviceIo)。不一定包含虚函数
C语言修过为 (int)

三:其它差异
1.变量的定义:int nIndex( 1 );
C++初使化类会这么做,也可以把int 看作一个类
C语言当中修改为
int nIndex = 1;

2. for循环初使化: For (int i = 0; i < 10; i++)
不符合C99
C语言修过为
Int i = 0;
     For (i = 0; i < 10; i++)
3.赋值操作:++(p = a);    
error:左值需要增加操作数
C语言修过为
P = a;
++p;
4.引用部分,C++表示与变量用享一段内存。一个变量的别名。
C语言修改过
(1)传递的引用是只读,则可以去掉&,改为变量传递。
(2)传递的引用有写操作,改成传递指针。

四:各文件移植顺序
1. 与平台相关的部分:
此部分自己改写,因为平台不同实现有差异,所以需要注意它在内核实现哪些功能和驱动组织的结构,没有必要一句一句去翻译,这是不可能的。主可就是抓住它是用什么样的结构去实现它的功能。
2. 与平台不相关的部分:
总体原则:修改C++与C的差异。
PDO目录:顺序是PdoPosition.c PdoPulse.c PdoVm.c PdoFrame.c

五:目前还没有实现的问题
(1)ScrewCompensation.c 有关内核浮点除法运算
#define UInt32x32To64(a, b) ((unsigned long long)(((unsigned long long)((unsigned int)(a))) * ((unsigned int)(b))))

(2) PdoPulse.c PdoPulse_MotionToPulse函数,AxLength类
(3) PdoVm.c PdoVm_RunCode函数,引用A = (UINT32 &)Pdo[Ck],以及除法操作编译不通过。__aeabi_ldivmod
原创粉丝点击